powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ну почему не работает индех
10 сообщений из 10, страница 1 из 1
Ну почему не работает индех
    #32035032
alexr_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
MS SQL 7.0
Есть вот такой запроc, в котором объединяются две таблички.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        select  m.ID as NTS_ID, c.ID as Carr_ID,
        abs(m.Answered_Duration - c.Answered_Duration) as DurDelta
        from  CDRTmp C WITH (INDEX(CDRTmp_IDX_MinDate))
        left outer join WMasterCall M WITH (INDEX(WMasterCall_IDX_Time_Out_Trunk))
        on (m.out_trunk_group =  22  and m.Carr_call_id = - 1  and
        m.call_date_time_k between c.MinDate and c.MaxDate)
        order by c.MinDate, c.ID, DurDelta


CDRTmp -- несколько тысяч записей, WMasterCall --миллионы.

Индекс WMasterCall_IDX_Time_Out_Trunk построен по трем полям:
Код: plaintext
1.
2.
3.
4.
5.
6.
 CREATE  INDEX 
[WMasterCall_IDX_Time_Out_Trunk] ON 
[dbo].[WMasterCall]
([out_trunk_group], [Carr_call_id], [call_date_time_k]) 
ON [PRIMARY]
GO

Статистика обновлялаcь.

Долго долго мучил запрос, наконец оптимизатор решил со мной согласиться и использовать сразу все три колонки индекса, когда вместо inner join стал использовать left outer join. Ну хрен с ним, я смирился.
Запрос стал летать. Раз 10 выполнился на ура.

А потом оптимизатор опять решил, что надо использовать
только два первых поля от индекса (по ним выборка в пол миллиона строк получается), а дальше букмаркать таблицу, сохранять ее во временную и потом в nested loop
объединять по времени. И теперь запрос вообще не открывается...
Вопрос собственно такой, что туда еще добавить чтоб оптимизатор заткнулся?!!!

Еще поле m.Carr_call_id неоднократно обновлялось.
Это могло навредить индексу?
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035049
Gena G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Я бы проверил что статистика обновляется на базе 100% записей

2. Всё-таки не стал использовать составной индекс. Попробуй разнести эти 3 поля и сделай 3 индекса вместо одного. Да, на забудь что в таблице почти всегда ОБЯЗАН быть кластерный индекс. Особенно когда таблица такого размера.
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035160
alexr_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Статистика обновлялась с подным сканированием
2) Попробую, хотя не уверен, что будет лучше
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035161
alexr_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл, кластерный индекс там конечно есть
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035210
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает в самом запросе использовать хинты, явно указывающие оптимизатору, какие именно индексы нужно использовать?
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035245
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри внимательно эдесь:http://www.swynk.com/friends/vartanyan/SQL70Joins.aspSWYNK.COM: Join Strategies in SQL Server 7.0.
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035246
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035252
alexr_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я все это читал, там в любом случае используется
loop join. Только в одном случае (который мне нужен)
берется выборка сразу по всем полям, а потом происходит объединение, а в другом (который работает несколько часов) выборка берется только по первым двум полям,
которые должны быть равны константам, а в loop join используется фильтрация в офигительной выборке.


Я не знаю, может это глюк 7-го SQL сервера, наверно пора переходить на 2000
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035254
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из BOL:

Consider using nonclustered indexes for:

- Columns that contain a large number of distinct values, such as a combination of last name and first name (if a clustered index is used for other columns). If there are very few distinct values, such as only 1 and 0, most queries will not use the index because a table scan is usually more efficient.

- Covering all columns from one table in a given query. This eliminates accessing the table or clustered index altogether.

и т.д.

Так вот - попробуй сделать индекс просто по полю call_date_time_k.

Еще вариант - сделать covered index по всем полям, участвующим в запросе. Что-нибудь типа

Код: plaintext
1.
2.
3.
4.
5.
CREATE  INDEX 
[WMasterCall_IDX_Time_Out_Trunk] ON 
[dbo].[WMasterCall]
([call_date_time_k], [out_trunk_group], [Carr_call_id], [Answered_Duration], [ID])
ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Ну почему не работает индех
    #32035875
alexr_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 VVG_
Thanks
Последний метод сработал, теперь все просто летает
Правда индекс немерянный получился, но зато
быстро собака летает.... :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ну почему не работает индех
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]