Лирика-лирикой, но попробуем вернуться к теме этого треда. У меня новый повод для ступора возник в отй же самой ситуации.
Итак - на некоторых часто выполняющихся запросах я благополучно добавил +0 и получил разумное время выполнения в доли миллисекунды там, где начали мы с 250 миллисекунд. И было у меня счастье, пока я в одном из отчетов не нашел вот такое (в общем, вариант того же запроса, что и раньше):
SELECT * FROM incalls where cid='тут подставляется номер телефона' order by id desc
запрос не prepard, поскольку выполняется 1 раз на отчет - выводит историю звонков, номер подставляется прямо в текст запроса. На первом fetch словил опять те же самые 250 ms, что были в начале треда (последующие выполнялись быстро). Поменял на +0, стало хорошо, но тут я задумался, что будет, если мы наткнемся на нехороший часто встречающийся номер (а такие есть). Естественно, оно будет тормозить, что и подтвердила практика - на запросе по номеру, встречающемуся 100000 раз (в базе из 1.5 миллиона записей) ФБ думал больше 500 мс при выполнении запроса. Эта задержка меня ничуть не удивила и обсуждать ее не интересно, но она заставила задуматься о том, что нужно какое-от другое решение, кроме +0.
И тут я решил посмотреть, как выполняются заросы без +0 при выборках номеров с разным количеством записей:
1. запрос с номером, встречающимся 1 раз в БД. первый fetch выполняется примерно 170 мс
2. запрос с номером, встречающимся 1156 раз в БД. первый fetch выполняется примерно 300 мс
3. Запрос с номером, встречающимся 105088 раз в БД, первый fetch выполняется 40 ms
Статистика по запросам, по порядку 1, 2, 3 по показания flamerobin:
Preparing query: SELECT * FROM incalls where cid='1234567' order by id desc
Prepare time: 00:00:00.
Field #01: INCALLS.ID Alias:ID Type:INTEGER
Field #02: INCALLS.CID Alias:CID Type:STRING(20)
Field #03: INCALLS.CALLTO Alias:CALLTO Type:STRING(20)
Field #04: INCALLS.STARTTIME Alias:STARTTIME Type:TIMESTAMP
Field #05: INCALLS.LENGTH Alias:LENGTH Type:INTEGER
Field #06: INCALLS.TOTALTALK Alias:TOTALTALK Type:INTEGER
Field #07: INCALLS.DISCREASON Alias:DISCREASON Type:SMALLINT
Field #08: INCALLS.CLIENT Alias:CLIENT Type:INTEGER
Field #09: INCALLS.WAITLENGTH Alias:WAITLENGTH Type:SMALLINT
Field #10: INCALLS.DIALLENGTH Alias:DIALLENGTH Type:SMALLINT
PLAN (INCALLS ORDER INCALLS_ID_D INDEX (INCID))
Executing...
Done.
1492 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 13 index, 0 seq.
Delta memory: -18772 bytes.
Execute time: 00:00:00.
Script execution finished.
Preparing query: SELECT * FROM incalls where cid='2991112' order by id desc
Prepare time: 00:00:00.
Field #01: INCALLS.ID Alias:ID Type:INTEGER
Field #02: INCALLS.CID Alias:CID Type:STRING(20)
Field #03: INCALLS.CALLTO Alias:CALLTO Type:STRING(20)
Field #04: INCALLS.STARTTIME Alias:STARTTIME Type:TIMESTAMP
Field #05: INCALLS.LENGTH Alias:LENGTH Type:INTEGER
Field #06: INCALLS.TOTALTALK Alias:TOTALTALK Type:INTEGER
Field #07: INCALLS.DISCREASON Alias:DISCREASON Type:SMALLINT
Field #08: INCALLS.CLIENT Alias:CLIENT Type:INTEGER
Field #09: INCALLS.WAITLENGTH Alias:WAITLENGTH Type:SMALLINT
Field #10: INCALLS.DIALLENGTH Alias:DIALLENGTH Type:SMALLINT
PLAN (INCALLS ORDER INCALLS_ID_D INDEX (INCID))
Executing...
Done.
4559 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 1036 index, 0 seq.
Delta memory: 18780 bytes.
Execute time: 00:00:01.
Script execution finished.
Preparing query: SELECT * FROM incalls where cid='#' order by id desc
Prepare time: 00:00:00.
Field #01: INCALLS.ID Alias:ID Type:INTEGER
Field #02: INCALLS.CID Alias:CID Type:STRING(20)
Field #03: INCALLS.CALLTO Alias:CALLTO Type:STRING(20)
Field #04: INCALLS.STARTTIME Alias:STARTTIME Type:TIMESTAMP
Field #05: INCALLS.LENGTH Alias:LENGTH Type:INTEGER
Field #06: INCALLS.TOTALTALK Alias:TOTALTALK Type:INTEGER
Field #07: INCALLS.DISCREASON Alias:DISCREASON Type:SMALLINT
Field #08: INCALLS.CLIENT Alias:CLIENT Type:INTEGER
Field #09: INCALLS.WAITLENGTH Alias:WAITLENGTH Type:SMALLINT
Field #10: INCALLS.DIALLENGTH Alias:DIALLENGTH Type:SMALLINT
PLAN (INCALLS ORDER INCALLS_ID_D INDEX (INCID))
Executing...
Done.
3214 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 1036 index, 0 seq.
Delta memory: 515652 bytes.
Execute time: 00:00:00.
Script execution finished.
чего-то я ничего не понимаю, план - один и тот же, а время выполнения меняется столько специфически.