|
|
|
Почему не работает индекс
|
|||
|---|---|---|---|
|
#18+
Уже два дня долбаюсь над проблемой, есть выборка из 3-х таблиц, две из которых содержат по несколько миллионов строк. Результат должен содержать около сотни тысяч строк Все вроде проиндексировано. Если в запросе указать select top 10000 from ... то все Ok и индексы используются как надо, если выбирать 40000 и больше, или просто все то используется кусок индекса, а дальше начинаются лупы, причем похоже без индекса. Вот сам запрос select m.ID as NTS_ID, c.ID as Carr_ID, abs(m.Answered_Duration - c.Answered_Duration) as DurDelta from (WCarriersDetail C WITH (INDEX (WCarriersDetail_IDX_Carr_ID_Time)) inner join Shift_table S with(INDEX(Shift_table_IDX_Trunk_Dates)) on c.CArr_ID = 22 and c.Carr_ID = s.Trunk and c.Call_date_time between s.FromDate and s.ToDate) inner join WMasterCall M WITH (INDEX(WMasterCall_IDX_Time_Out_Trunk)) on m.out_trunk_group = 2203 and m.Carr_call_id = -1 and m.call_date_time_k between (c.Call_date_time - s.ShiftMax) and (c.Call_date_time - s.ShiftMin) where ((m.destination_number like c.destination_number + '%' and m.destination_number <> '') or (c.destination_number like m.destination_number + '%' and c.destination_number <> '')) order by c.call_date_time, c.ID Мне нужно, чтоб выделенная часть, использовала индекс WMasterCall_IDX_Time_Out_Trunk, который построен по m.out_trunk_group, m.Carr_call_id, m.call_date_time_k (Именно в таком порядке) Причем, как я уже говорил, этот индекс используется, но только если поставить top 10000. В результате если делать выборку по 10000 - 20000 записей она получается за разумное время, а выборка без top ... строится очень долго. Как заставить оптимайзер использовать один и тот же план в обоих случаях? Заранее спасибо за любые комментарии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 12:30:05 |
|
||
|
Почему не работает индекс
|
|||
|---|---|---|---|
|
#18+
а если Select top 100 percent ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 14:37:46 |
|
||
|
Почему не работает индекс
|
|||
|---|---|---|---|
|
#18+
При любом select top ... precent Индексы вообще не используются Кроме того, если брать select top 10 .... то индекс тоже не используется. Т.е. эта сволочь хочет использовать индекс только на select top 10000 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 15:49:36 |
|
||
|
Почему не работает индекс
|
|||
|---|---|---|---|
|
#18+
А статистика давно ли обновлялась ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 16:54:20 |
|
||
|
Почему не работает индекс
|
|||
|---|---|---|---|
|
#18+
Статистику тоже обновлял (full scan), ничего не помогло. Индекс используется только если делать left outer join с последней таблицей. На этот select открывается курсор, и пришлось добавить проверку, что поля другой таблицы not null. После этого все стало работать за разумное время. Вот такая загадочная штука, этот оптимизатор. По видимому, это связано с тем, что он считает, что данные равномерно, распределены по таблице, а в данном случае условие дает достаточно узкую выборку. Но вот как его затставить использовать нужный мне план, так и осталось неизвестным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 11:51:35 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32034535&tid=1822086]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 383ms |

| 0 / 0 |
