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

Откуда:
Сообщений: 44
Скажите что нужно чтобы вместо nonclustered index scan sql server выполнил nonclustered index seek ( я так понимаю что при scan выполняется полное сканирование таблицы - просмотр всех записей а при seek поиск по таблице с использованием индекса )
Например в бд AdventureWorks если сделать запрос :
SELECT [address].City, [address].[AddressLine1] 
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

То в execution плане появится совет использования индекса :
/*
Missing Index Details from SQLQuery3.sql - 
The Query Processor estimates that implementing the following index could improve the query cost by 97.9636%.
*/

/*
USE [AdventureWorks]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [Person].[Address] ([City])

GO
*/

Но если при этом создать индекс :
USE [AdventureWorks]
GO
CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])

GO

И выполнить заново запрос, то Index scan остается, так что нужно чтобы был index seek?
28 авг 12, 12:38    [13075138]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City]) include ([AddressLine1] )
28 авг 12, 12:39    [13075145]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Kane_sql
Member

Откуда:
Сообщений: 44
Спасибо, тут http://stackoverflow.com/questions/12155363/how-to-perform-nonclustered-index-seek-instead-of-clustered-index-scan тоже самое сказали, работает, но на stackoverflow пишут что это "non-selective predicate", что это значит?
28 авг 12, 12:49    [13075250]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Kane_sql
Member

Откуда:
Сообщений: 44
А все, я понял, запрос:
USE [AdventureWorks]
GO
CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])

GO

Дает нужный результат если выбирать индексированные поля, к примеру:
SELECT [address].City, [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'


Тогда как выбрать Все поля из таблицы [AdventureWorks].[Person].[Address] где есть 'Seattle' без include в индексе, чтобы не было Index scan, пытаюсь так, но index scan присутствует:
SELECT * FROM [AdventureWorks].[Person].[Address] as [adr]
WHERE [adr].AddressID IN (
SELECT [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'
28 авг 12, 13:03    [13075362]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ну не выгодным считает сервер делать seek по некластерному и лукап в кластерный за недостающими полями.
28 авг 12, 13:04    [13075372]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Kane_sql
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич
Ну не выгодным считает сервер делать seek по некластерному и лукап в кластерный за недостающими полями.

Ок, а как тогда сделать такой запрос
SELECT *
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

чтобы использовался индекс по City (выполнялся index seek) и извлеклись все столбцы (*), если без использования include?
28 авг 12, 13:11    [13075425]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kane_sql
Гавриленко Сергей Алексеевич
Ну не выгодным считает сервер делать seek по некластерному и лукап в кластерный за недостающими полями.

Ок, а как тогда сделать такой запрос
SELECT *
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

чтобы использовался индекс по City (выполнялся index seek) и извлеклись все столбцы (*), если без использования include?
with ( forceseek )

Только почему вы решили, что seek - панацея?

Сообщение было отредактировано: 28 авг 12, 13:19
28 авг 12, 13:18    [13075514]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Kane_sql
Member

Откуда:
Сообщений: 44
пропущено...

Только почему вы решили, что seek - панацея?

Да действительно так работает?, спасибо:
SELECT * FROM [AdventureWorks].[Person].[Address] as [adr] WITH (FORCESEEK)
WHERE [adr].AddressID IN (
SELECT [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'
) ;

А можете пояснить почему он сначала не делает по обоим запросам seek, почему тогда по запросам в отдельности:
SELECT * FROM [AdventureWorks].[Person].[Address] as [adr]
WHERE [adr].AddressID IN( 10, 12 );

SELECT [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

Происходит seek, а в суммарном запросе присутствует scan?
По поводу панацеи, разве scan - это не нехорошо?
28 авг 12, 13:31    [13075654]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kane_sql
По поводу панацеи, разве scan - это не нехорошо?
Скан вполне себе ок, когда нужен скан.
28 авг 12, 14:11    [13076030]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Kane_sql
пропущено...

Только почему вы решили, что seek - панацея?

Да действительно так работает?, спасибо:
SELECT * FROM [AdventureWorks].[Person].[Address] as [adr] WITH (FORCESEEK)
WHERE [adr].AddressID IN (
SELECT [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'
) ;

А можете пояснить почему он сначала не делает по обоим запросам seek, почему тогда по запросам в отдельности:
SELECT * FROM [AdventureWorks].[Person].[Address] as [adr]
WHERE [adr].AddressID IN( 10, 12 );

SELECT [address].AddressID
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

Происходит seek, а в суммарном запросе присутствует scan?
По поводу панацеи, разве scan - это не нехорошо?
потому что с вашими 2-мя запросами сервер делает 2 seek а потом еще и лукап. Когда же это один запрос, то Нафига ему делать 3 операции когда можно сделать всего одну?
28 авг 12, 19:27    [13078506]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Kane_sql
Member

Откуда:
Сообщений: 44
потому что с вашими 2-мя запросами сервер делает 2 seek а потом еще и лукап. Когда же это один запрос, то Нафига ему делать 3 операции когда можно сделать всего одну?

Честно говоря не совсем пойму - где там lookup с двумя запросами? И где вы видите три операции.
28 авг 12, 23:07    [13079083]     Ответить | Цитировать Сообщить модератору
 Re: nonclastered index scan  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Kane_sql
потому что с вашими 2-мя запросами сервер делает 2 seek а потом еще и лукап. Когда же это один запрос, то Нафига ему делать 3 операции когда можно сделать всего одну?

Честно говоря не совсем пойму - где там lookup с двумя запросами? И где вы видите три операции.
Да, сорри, лукапа там не будет, я ошибся.
Просто вы заставляете сервер так как вы хотите чтобы он выполнил этот запрос, но не факт что это быстрее/выгоднее.
29 авг 12, 21:14    [13085448]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить