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

Откуда: MOSKAU
Сообщений: 312
Есть большая таблица - справочник.
Обновляется очень редко. Можно сказать, что она только для чтения.

Выбираю поля для составного кластерного индекса.
т.к. он будет уникальный, то набор полей ограничен. Больше можно, меньше - нет.
Предлагаемый набор полей следующий:
SrID, FSrID, OSrID, AtID, AtVeID
Хотелось бы поле FSrID поставить первым, а затем SrID, т.к. FSrID наименее селективное и несколько сложных запросов будут выполнятся гораздо быстрее.
Но, в 70% запросов, поле FSrID не используется и если его поставить на 1-е место, то кластерный индекс вообще не будет использоваться (т.е. я получу скан, что совсем не нужно). Ставлю поле FSrID вторым и получаю следующее ...

В итоге:
Запросы, где работает последовательность полей SrID, FSrID, OSrID, AtID, AtVeID работают на ура (т.е. я получаю index seek? что и требовалось).
Запросы, где используется FSrID работают не на ура (ну, с этим я как-нибудь разберусь).
Запросы, где используются следующие последовательности полей SrID, OSrID, AtID, AtVeID и SrID, AtID, AtVeID так же используют seek по кластерному индексу, что мне не очень понятно.
Собственно говоря вопросы такие:
Как SQL Server использует составной кластерный индекс в случае отсутствия в параметрах поиска части полей входящих в кластерный индекс?
То что поле SrID должно быть в параметрах поиска это понятно ... Ситуация когда параметры поиска SrID, FSrID, OSrID тоже ясна. А вот что происходит когда в параметрах поиска отсутствует часть полей из "середины" индекса (SrID, ..., ..., AtID, AtVeID)?
План выполнения мне показывает clustered index seek по полям SrID, AtID, AtVeID. Тут мне не ясно, что происходит: идет seek по SrID, а дальше scan по AtID, AtVeID или все таки план не врет и действительно происходит seek по полям AtID, AtVeID тогда объясните мне, пожалуйста, как это происходит.
9 ноя 09, 13:07    [7901219]     Ответить | Цитировать Сообщить модератору
 Re: Как SQL Server использует кластерный индекс?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А вот что
> происходит когда в параметрах поиска отсутствует часть полей из
> "середины" индекса (SrID, ..., ..., AtID, AtVeID)?
> План выполнения мне показывает clustered index seek по полям SrID, AtID,
> AtVeID. Тут мне не ясно, что происходит: идет seek по SrID, а дальше
> scan по AtID, AtVeID или все таки план не врет и действительно
> происходит seek по полям AtID, AtVeID тогда объясните мне, пожалуйста,
> как это происходит.

в операции поиска показано должно быть, по каким столбцам собственно seek
идет, а по каким уже фильтрация. типа:

|--Clustered Index Seek(OBJECT:([AdventureWorks].[dbo].[t].[ux_t]),
SEEK:([AdventureWorks].[dbo].[t].[c1]=CONVERT_IMPLICIT(int,[@1],0)),
WHERE:([AdventureWorks].[dbo].[t].[c3]=CONVERT_IMPLICIT(int,[@2],0)) ORDERED FORWARD)


Posted via ActualForum NNTP Server 1.4

9 ноя 09, 13:28    [7901406]     Ответить | Цитировать Сообщить модератору
 Re: Как SQL Server использует кластерный индекс?  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
1) А с чего вы взяли, что кластерный индекс должен быть уникальным?
2)А что мешает создать несколько индексов с нужным набором полей?
3)А кластерный индекс лучше создавать по тем полям, по которым происходит упорядочная выборка.
9 ноя 09, 14:40    [7902058]     Ответить | Цитировать Сообщить модератору
 Re: Как SQL Server использует кластерный индекс?  [new]
Влом регистрироваться
Guest
Сколько много вопросов и сразу :)

PokeMan
что происходит когда в параметрах поиска отсутствует часть полей из "середины" индекса (SrID, ..., ..., AtID, AtVeID)?

Если индекс будет использоваться, то произойдет seek по тем полям, которые перечислены первыми, а по остальным полям будет scan.
9 ноя 09, 14:52    [7902190]     Ответить | Цитировать Сообщить модератору
 Re: Как SQL Server использует кластерный индекс?  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
to daw, спасибо ткнули куда нада.

to --__Александр__--,

--__Александр__--
1)А с чего вы взяли, что кластерный индекс должен быть уникальным?

ни с чего не взял ... но в нашем случае будет уникальный.
--__Александр__--
2)А что мешает создать несколько индексов с нужным набором полей?

у меня по данной таблице запросы принципиально одинаковые, нужно было решить как лучше организовать кластерный индекс. Скорее всего введу еще пару не кластерных для решения всех проблем
--__Александр__--
3)А кластерный индекс лучше создавать по тем полям, по которым происходит упорядоченная выборка.
Согласен.

Спасибо большое. Все что хотел узнать - узнал.
9 ноя 09, 14:58    [7902263]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить