Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Избавиться от Clustered Index Scan  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Приветствую!

Есть запрос:

SELECT * 
FROM RE_USL AS L
WHERE L.SLU_ID IN 
(SELECT SLU_ID FROM RE_SLU WHERE KMP1_ID=204)

Связь RE_SLU и RE_USL по полю SLU_ID один ко многим. Количество строк в RE_USL около 13 млн. Строк в выборке - 32.

В результате получаю план (см. вложение). Время выполнения около 2 минут.
По полю RE_USL.SLU_ID есть индекс, который используется если запрос будет вида:

SELECT * 
FROM RE_USL AS L
WHERE L.SLU_ID IN 
('808EEC69-72EC-4D27-BE9F-F7F9A9593FC3','424D083D-F780-464E-BAC7-221D54D10EC4')

Время выполнения около 0 секунд.

Просьба подсказать, как заставить сервер использовать Index Seek вместо Clustered Index Scan?
23 авг 11, 10:46    [11162010]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
aleks2
Guest
Засунь
(SELECT DISTINCT SLU_ID FROM RE_SLU WHERE KMP1_ID=204)
в табличную переменную с кластерным индексом и используй INNER JOIN.
шо-то вроде

declare @t table (SLU_ID primary key clustered)
insert @t
SELECT DISTINCT SLU_ID FROM RE_SLU WHERE KMP1_ID=204

SELECT L.* 
FROM RE_USL AS L INNER JOIN @t T ON L.SLU_ID=T.SLU_ID 
23 авг 11, 10:55    [11162097]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
_Shakill
Guest
tas, план не приложился
а если

SELECT L.* 
FROM RE_USL AS L
JOIN RE_SLU AS R ON L.SLU_ID = R.SLU_ID
WHERE R.KMP1_ID=204

что-нибудь изменится?
ну и индекс по RE_SLU.KMP1_ID должен быть
23 авг 11, 10:55    [11162104]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Сорри - план прикрепляю здесь...

Если использовать запрос с соединением вида:

SELECT * 
FROM RE_USL AS L
INNER JOIN RE_SLU AS R
ON L.SLU_ID=R.SLU_ID
WHERE
R.KMP1_ID=204

то план тот же.

для запроса:

declare @t table (SLU_ID uniqueidentifier primary key clustered)
insert @t
SELECT DISTINCT SLU_ID FROM RE_SLU WHERE KMP1_ID=204

SELECT L.* 
FROM RE_USL AS L INNER JOIN @t T ON L.SLU_ID=T.SLU_ID

к сожалению Clustered Index Scan никуда не делая. По сути план такой-же...

К сообщению приложен файл (111.sqlplan - 103Kb) cкачать
23 авг 11, 11:08    [11162240]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
Glory
Member

Откуда:
Сообщений: 104751
tas
к сожалению Clustered Index Scan никуда не делая. По сути план такой-же...

А что там за Compute scalar выражения по-которому потому почему то идет join ?
У вас точно типы столбцов совпадают ?
23 авг 11, 11:14    [11162302]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Да, они не совпадают, правда по наполнению одно и то-же.

RE_SLU.SLU_ID - uniqueidentifier
RE_USL.SLU_ID - varchar(36)

Думаете из-за этого?
23 авг 11, 11:19    [11162353]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
Glory
Member

Откуда:
Сообщений: 104751
tas
Думаете из-за этого?

А как вы думаете, как сервер вычислит индексные значения uniqueidentifier, не сканируя все значения таблицы ?
23 авг 11, 11:21    [11162369]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
tas
...Думаете из-за этого?
А чо тут думать? Идет неявное приведение типов.
23 авг 11, 11:21    [11162372]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от Clustered Index Scan  [new]
tas
Member

Откуда: Москва
Сообщений: 95
Всем спасибо! Буду менять структуру этого поля, только подумаю, где это может аукнуться...
23 авг 11, 11:27    [11162429]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить