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

Откуда:
Сообщений: 679
Всем привет!

Помогите разобраться с Include для некластерного индекса. По документации ничего не понял.

Как используется столбцы указанные в Include ? Влияет ли на производительность кол-во столбцов в Include их типы и заданная последовательность ? В каком случае нужно использоваться Include, а к примеру не создавать два некластерных индекса по двум столбцам ?
27 окт 12, 21:35    [13385755]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Testor1,

Не желаете прочитать немного Relational Database Index Design and the Optimizers тут? Очень доступно расписано.

Обычно include используется для создания покрывающего индекса, по столбцам не нужен поиск, последовательность не важна.
Влияет на производительность чего?
28 окт 12, 00:20    [13386102]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
В индекс (как дополнение) включаются поля, которые будут (когда-нибудь позже) использоваться для поиска... Полезно для ускорения поиска с использованием (в основном) полей именно этого индекса в перемешку со значениями тех полей, которые указаны в Инклуд. Ну как-то вот так.
PS если нае6ашить в Include слишком много полей типа nvarchar(max) забитых данными, то базе будет очень хреново. В смысле,- работать с таким индексом ...
28 окт 12, 00:31    [13386128]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Testor1
Member

Откуда:
Сообщений: 679
Alexander Titkin
Testor1,

Не желаете прочитать немного Relational Database Index Design and the Optimizers тут? Очень доступно расписано.

Обычно include используется для создания покрывающего индекса, по столбцам не нужен поиск, последовательность не важна.
Влияет на производительность чего?


Заказать пока не могу. Возможно в следующем году закажу курсы.
Производительность запроса/ов

Каков критерий добавление столбцов в Include ?

Критерий добавления столбцов в индекс - еще более менее понятен, а вот в Include не совсем.

К слову. Есть историческая таблица с транзакциями разных клиентов по датам и времени.

В 90% случаев делается запрос из таблицы по клиентам и за определенный период. Таблицы очень большие. Кол-во записей на одного клиента могут превышать 1000 (данные за разные даты).

Для данной таблицы нужно создавать некластерный индекс по полю client и с include (datetime) или нужно создавать составной индекс client+datetime ?
28 окт 12, 09:55    [13386556]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Testor1
Каков критерий добавление столбцов в Include ?

Критерий добавления столбцов в индекс - еще более менее понятен, а вот в Include не совсем.


Рискну предложить Вам следующее понимание: индекс с включенными в него полями, это, считай, альтернативная версия таблицы, структура которой оптимизирована для быстрого поиска по ряду ключевых полей.

В чем ее преимущество - если при использовании обычного некластерного индекса в результате поиска в нем вы получаете некую "ссылку" на строку в основной таблице, и - если, конечно, Вам нужно неиндексированное поле, - должны затем выполнить поиск строки по указанной "ссылке", то при использовании индекса с включенными полями, второго этапа Вы избегаете, поскольку копии необходимых Вам данных уже хранятся прямо на страницах индекса. Т.е. конечный результат Вы получаете намного быстрее.

(В чем ее недостаток - расход на хранение копий столбцов, цитирую: " если нае6ашить в Include слишком много полей типа nvarchar(max) забитых данными, ... будет очень хреново".)

Соотв., некластерный индекс по полям [a], [b], [c] с включенным в него полем d можно использовать в тех случаях, когда Вы хотите получать все значения d, соответствующие избранным значения a, b и c - т.е. когда значения d Вам нужны, но после ограничения выборки условиями для a, b и c (дальнейший) отсев по критерию d = smth не предполагается. И, соответсвенно, включать поле d в список индексированных полей нету смысла.
28 окт 12, 10:51    [13386624]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Testor1
Member

Откуда:
Сообщений: 679
Shlippenbaranus
Testor1
Каков критерий добавление столбцов в Include ?

Критерий добавления столбцов в индекс - еще более менее понятен, а вот в Include не совсем.


Рискну предложить Вам следующее понимание: индекс с включенными в него полями, это, считай, альтернативная версия таблицы, структура которой оптимизирована для быстрого поиска по ряду ключевых полей.

В чем ее преимущество - если при использовании обычного некластерного индекса в результате поиска в нем вы получаете некую "ссылку" на строку в основной таблице, и - если, конечно, Вам нужно неиндексированное поле, - должны затем выполнить поиск строки по указанной "ссылке", то при использовании индекса с включенными полями, второго этапа Вы избегаете, поскольку копии необходимых Вам данных уже хранятся прямо на страницах индекса. Т.е. конечный результат Вы получаете намного быстрее.

(В чем ее недостаток - расход на хранение копий столбцов, цитирую: " если нае6ашить в Include слишком много полей типа nvarchar(max) забитых данными, ... будет очень хреново".)

Соотв., некластерный индекс по полям [a], [b], [c] с включенным в него полем d можно использовать в тех случаях, когда Вы хотите получать все значения d, соответствующие избранным значения a, b и c - т.е. когда значения d Вам нужны, но после ограничения выборки условиями для a, b и c (дальнейший) отсев по критерию d = smth не предполагается. И, соответсвенно, включать поле d в список индексированных полей нету смысла.



Плиз, можешь на моем примере дать ответ. Какой бы ты выбрал бы индекс и почему?
Твое пояснение и понятно и нет :). Возможно разбор реального примера поможет все уяснить.



Есть историческая таблица с транзакциями разных клиентов по датам и времени. 

В 90% случаев делается запрос из таблицы по клиентам и за определенный период. Таблицы очень большие. Кол-во записей на одного клиента могут превышать 1000 (данные за разные даты). 

Для данной таблицы нужно создавать некластерный индекс по полю client и с include (datetime) или нужно создавать составной индекс client+datetime ?
28 окт 12, 11:09    [13386642]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Testor1
К слову. Есть историческая таблица с транзакциями разных клиентов по датам и времени.

В 90% случаев делается запрос из таблицы по клиентам и за определенный период. Таблицы очень большие. Кол-во записей на одного клиента могут превышать 1000 (данные за разные даты).

Для данной таблицы нужно создавать некластерный индекс по полю client и с include (datetime) или нужно создавать составной индекс client+datetime ?


В Вашем случае я б, вероятней всего, создавал составной индекс datetime+client. Поскольку, во-первых, client входит в список полей, по которым осуществляется поиск, во-вторых, кроме поля client Вам наверняка будут нужны будут и другие поля, и наверняка их там много. Т.к. все Вы в их в индекс не включите, толк от присутствия в индексе поля client будет весьма ограниченный.

(предполагаю, что клиентов у Вас много)
28 окт 12, 11:16    [13386653]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Testor1
Member

Откуда:
Сообщений: 679
Shlippenbaranus
Testor1
К слову. Есть историческая таблица с транзакциями разных клиентов по датам и времени.

В 90% случаев делается запрос из таблицы по клиентам и за определенный период. Таблицы очень большие. Кол-во записей на одного клиента могут превышать 1000 (данные за разные даты).

Для данной таблицы нужно создавать некластерный индекс по полю client и с include (datetime) или нужно создавать составной индекс client+datetime ?


В Вашем случае я б, вероятней всего, создавал составной индекс datetime+client. Поскольку, во-первых, client входит в список полей, по которым осуществляется поиск, во-вторых, кроме поля client Вам наверняка будут нужны будут и другие поля, и наверняка их там много. Т.к. все Вы в их в индекс не включите, толк от присутствия в индексе поля client будет весьма ограниченный.

(предполагаю, что клиентов у Вас много)


а почему datetime+client, а не client+datetime ?

P.S.
То есть правильно я понимаю, что в случае если столбец включен в Include, то индекс хранит копию "значения" того столбца и строки на которую ссылается?
28 окт 12, 11:24    [13386668]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Правильный ответ
кластерный индекс client, datetime
Если кластерный нельзя, то некластерный индекс client, datetime c include нужных столбцов

автор
В Вашем случае я б, вероятней всего, создавал составной индекс datetime+client.


После диапазонного поиска по Datetime поиска по Client увы не будет
28 окт 12, 11:49    [13386698]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Shlippenbaranus
Testor1
Каков критерий добавление столбцов в Include ?

Критерий добавления столбцов в индекс - еще более менее понятен, а вот в Include не совсем.


Рискну предложить Вам следующее понимание: индекс с включенными в него полями, это, считай, альтернативная версия таблицы, структура которой оптимизирована для быстрого поиска по ряду ключевых полей.

В чем ее преимущество - если при использовании обычного некластерного индекса в результате поиска в нем вы получаете некую "ссылку" на строку в основной таблице, и - если, конечно, Вам нужно неиндексированное поле, - должны затем выполнить поиск строки по указанной "ссылке", то при использовании индекса с включенными полями, второго этапа Вы избегаете, поскольку копии необходимых Вам данных уже хранятся прямо на страницах индекса. Т.е. конечный результат Вы получаете намного быстрее.

(В чем ее недостаток - расход на хранение копий столбцов, цитирую: " если нае6ашить в Include слишком много полей типа nvarchar(max) забитых данными, ... будет очень хреново".)

Соотв., некластерный индекс по полям [a], [b], [c] с включенным в него полем d можно использовать в тех случаях, когда Вы хотите получать все значения d, соответствующие избранным значения a, b и c - т.е. когда значения d Вам нужны, но после ограничения выборки условиями для a, b и c (дальнейший) отсев по критерию d = smth не предполагается. И, соответсвенно, включать поле d в список индексированных полей нету смысла.


+1 (Это правильная интерпретация... А вот я чо-то ночью фигню настрочил ).
28 окт 12, 13:20    [13386846]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Testor1
Member

Откуда:
Сообщений: 679
Alexander Titkin,

Если я правильно все понял и индекс содержит значение строк из полей include, то они будут сильно увеличивать сам индекс. А это может сказаться на скорости обновления индекса и выборки. Скорее всего имеет смысл в Include добавлять значения при условии, что таблицы небольшие и размерность добавляемых полей небольшая - до 10 байт на поле.

Пока не до конца разобрался. Плиз, не прав, то поясните. Хочу хорошо разобраться в данном вопросе.
28 окт 12, 15:52    [13387179]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Testor1,

msdn
А что не понятно?

USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO

Неключевые столбцы хранятся на конечном уровне сбалансированного дерева индекса.
Отсюда следует, что индекс (ниже) занимает больше места.
USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode, AddressLine1, AddressLine2, City, StateProvinceID);
GO


Посмотрите на структуру дерева некластерного индекса ссылка.
28 окт 12, 16:24    [13387237]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
Testor1,

За все нужно платить, либо местом на диске и обслуживанием индексов, либо быстротой селектов.
Какие 10 байт)))) Какие критерии))) Заказчик поставит timeout на запрос и вы в индекс еще include nvarchar(max) сделаете.
А если есть желание на месте экономить - включайте компрессию индекса.
28 окт 12, 21:50    [13387908]     Ответить | Цитировать Сообщить модератору
 Re: Некластерный индекс и Include  [new]
Testor1
Member

Откуда:
Сообщений: 679
Alexander Titkin
Testor1,

За все нужно платить, либо местом на диске и обслуживанием индексов, либо быстротой селектов.
Какие 10 байт)))) Какие критерии))) Заказчик поставит timeout на запрос и вы в индекс еще include nvarchar(max) сделаете.
А если есть желание на месте экономить - включайте компрессию индекса.


Чем больше размер индекса, тем он менее эффективен. Нужно искать золотую середину. В некоторых случая лучше хранить ссылку на данные.
29 окт 12, 09:48    [13388847]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить