Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 index scan-> index seek + key lookup  [new]
mssql2008
Member

Откуда:
Сообщений: 13
Здравствуйте.
Есть запрос (база AdventureWorks [url=]http://msftdbprodsamples.codeplex.com/releases/view/37109#DownloadId=96448[/url])
SELECT
	p.name AS ProdName
	,c.TerritoryID
	,SUM(od.OrderQty)
FROM
	Sales.SalesOrderHeader oh
INNER JOIN Sales.Customer c ON c.CustomerID = oh.CustomerID
INNER JOIN Sales.SalesOrderDetail od ON oh.SalesOrderID = od.SalesOrderID
JOIN Production.Product p ON p.ProductID = od.ProductID
WHERE
	oh.OrderDate >= '2004-06-09'
	AND oh.OrderDate <= '2004-06-11'
GROUP BY 
	p.name
	,c.TerritoryID

При просмотре плана вижу INDEX SCAN (1) по индексу IX_Customer_TerritoryID
(файл Plan1.sqlplan (1))
При выборке 213 из 19000 скан совсем не уместен на мой взгляд. Хотя для таблицы SalesOrderDetail используется CLUSTERED INDEX SEEK PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (3).

Далее создаю NONCLUSTERD INDEX по полю Sales.Customer.CustomerID -
IX_Customer_CustomerID(при наличии CLUSTERED INDEX PK_Customer_CustomerID)

Вижу что поиск идет уже с использованием нового индекса (INDEX SEEK + KeyLookup IX_Customer_CustomerID)(файл plan2.sqlplan (1,4))

1) Почему было выбрано сканирование?(план № 1).
2)Почему появился keylookup если для SalesOrderDetail используется CLUSTERED INDEX SEEK PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID без keylookup (план №2)

Что не вызывает вопросов это:
1)Статистика актуальна
2)IX_Customer_TerritoryID был выбран в первом плане т.к. не было другого подходящего IX_***, а PK_Customer_CustomerID выбирать дороже т.к. он кластерный.

Скрипты таблиц не привожу, но сверху ссылка на установленную мной AdventureWorks.

Помогите разобраться пожалуйста
ЗЫ мысль о том что в Customer может быть не 19000 записей а 20 млн. приводит в ступор
9 окт 11, 02:35    [11408554]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
mssql2008
Member

Откуда:
Сообщений: 13
Файлы

К сообщению приложен файл (plan.rar - 53Kb) cкачать
9 окт 11, 02:39    [11408560]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
iljy
Member

Откуда:
Сообщений: 8711
mssql2008,

вы почему-то упираетесь в Index Scan, совершенно не обращая внимания, на Hash Match/Nested Loops. Оптимизатор может решить, что выполнение одного сканирования небольшого индекса дешевле нескольких сотен поисков по кластерному.
9 окт 11, 10:26    [11408747]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
mssql2008
ЗЫ мысль о том что в Customer может быть не 19000 записей а 20 млн. приводит в ступор
Но в ней же не 20 млн. Планы то строятся по реальной статистике.

Вы посмотрите в профайлере реальные затраты на выполнение, и сравните количество чтений и ЦПУ - какой вариант быстрее.
9 окт 11, 11:09    [11408774]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
mssql2008
Member

Откуда:
Сообщений: 13
alexeyvg, iljy.

Да Вы правы, когда увеличил размер таблицы до 1,5 млн. оптимизатор вместо скана выбрал CLUSTERED INDEX SEEK. Профайлер подтвердил выбор оптимизатора.

Остался вопрос - CLUSTERED INDEX SEEK PK_*** не является ли признаком того что нужно сделать NOCLUSTERED INDEX по PK_*** , в данном случае при его наличии оптимизатор выбрал бы NONCLUSTERED INDEX SEEK + KEY LOOKUP, понятно что IX_*** дешевле чем PK_***. вопрос о маштабируемости на все(другие) примеры.
9 окт 11, 23:15    [11409879]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
iljy
Member

Откуда:
Сообщений: 8711
mssql2008,

вы ерундой занимаетесь. Выбор плана зависит от такого количества параметров, что такие вопросы сродни гаданию на кофейной гуще. Я уж не говорю о том, что в реальной жизни создание индексов является компромиссом между скоростью чтения и скоростью записи.
9 окт 11, 23:20    [11409893]     Ответить | Цитировать Сообщить модератору
 Re: index scan-> index seek + key lookup  [new]
mssql2008
Member

Откуда:
Сообщений: 13
iljy,

Я это подозревал =))
Ок, Спасибо.
9 окт 11, 23:27    [11409917]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить