Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите сделать грамотный индекс  [new]
MeGusta
Guest
Доброго дня!
Есть таблица примерно такая
CREATE TABLE DBO.SOME_OBJECTS (
Id uniqueidentifier primary key,
OpDate datetime,
....
Deleted bit 

) 

В ней пара миллионов записей. К ней будет много селектов типа
WHERE OpDate BETWEEN @SDate AND @EDate AND @Deleted = 0  
или много джойнов по ID, но с условием DELETED = 0
По датам селективность высокая, по DELETED очень низкая.

Помогите, пожалуйста, сделать наиболее эффективных индексов.
 /*такой? */
CREATE NONCLUSTERED INDEX n_indexname  ON  DBO.SOME_OBJECTS (ID, Deleted) 
CREATE NONCLUSTERED INDEX n_indexname ON DBO.SOME_OBJECTS (OpDate) 
/*или*/

CREATE NONCLUSTERED INDEX n_indexname ON DBO.SOME_OBJECTS (OpDate, Deleted) 

/*или*/ 
CREATE NONCLUSTERED INDEX n_indexname ON DBO.SOME_OBJECTS (OpDate) INCLUDE (Deleted) 

/*Или вообще что-то другое? */
29 ноя 17, 14:40    [20992081]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
Владислав Колосов
Member

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

кластерный по OpDate.
29 ноя 17, 14:44    [20992111]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
aleks222
Guest
MeGusta
/*Или вообще что-то другое? */


Модератор: Беспардонная грубость скипнута
, фильтрованный индекс придумали.

CREATE INDEX ... where deleted = 0


Сообщение было отредактировано: 30 ноя 17, 13:03
29 ноя 17, 17:02    [20992934]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
Владислав Колосов
Member

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

там же селективность 1 к 100, скан будет да и то, если прослушивание парамеров simple.
29 ноя 17, 17:52    [20993189]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Владислав Колосов
aleks222,

там же селективность 1 к 100, скан будет да и то, если прослушивание парамеров simple.
Вот как раз фильтрованный подойдёт, в нём не будет записей с deleted <> 0, никакого скана

Что там будет ещё в индексе, зависит от запросов.
Например, так:
CREATE NONCLUSTERED INDEX n_indexname  ON  DBO.SOME_OBJECTS (OpDate) INCLUDE(поля, которые перечислены в SELECT) WHERE Deleted = 0
29 ноя 17, 18:24    [20993278]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
Alex_496
Member [заблокирован]

Откуда: https://www.dvbi.ru
Сообщений: 3869
кластерный по OpDate,
на вырост таблицы партиционировать по OpDate, если версия ЕЕ
columnstore index - проверить на запросах, смотря что и как часто выбирается
29 ноя 17, 18:37    [20993315]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
alexeyvg
Владислав Колосов
aleks222,

там же селективность 1 к 100, скан будет да и то, если прослушивание парамеров simple.
Вот как раз фильтрованный подойдёт, в нём не будет записей с deleted <> 0, никакого скана

Что там будет ещё в индексе, зависит от запросов.
Например, так:
CREATE NONCLUSTERED INDEX n_indexname  ON  DBO.SOME_OBJECTS (OpDate) INCLUDE(поля, которые перечислены в SELECT) WHERE Deleted = 0
Если по фильтру 99% строк, то какой смысл от этого фильтра? Правильно. Никакого. Да и запросы типа
WHERE Deleted = @Deleted

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


Я бы сказал, что если есть возможность избежать лукапов по всем полям которые в селекте, то можно добавить Deleted в INCLUDE (в сам ключ индекса безсмысленно по сути, использоваться все равно не будет), а если лукапы все равно неизбежны, то я бы даже не стал заморачиваться.
30 ноя 17, 02:22    [20994094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
iii2
Member

Откуда:
Сообщений: 202
Alex_496
кластерный по OpDate,
на вырост таблицы партиционировать по OpDate, если версия ЕЕ
columnstore index - проверить на запросах, смотря что и как часто выбирается

С 2016SP1 уже можно и в стандарте!
30 ноя 17, 08:17    [20994221]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Mind
Если по фильтру 99% строк, то какой смысл от этого фильтра? Правильно. Никакого. Да и запросы типа
Ээээ, наверное, я не так понял задачу.
Я полагал, что записей с DELETED = 0 в таблице 0.001 от общего количества записей, я так понял высказывание:
MeGusta
По датам селективность высокая, по DELETED очень низкая.


Если же по фильтру действительно 99% строк, то лучший вариант кластерный по дате, или, если в select узкий набор, то можно рассмотреть некластерный по дату с INCLUDE нужных полей
30 ноя 17, 09:03    [20994261]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
MeGusta
Guest
Зарапартовался, прошу прощения. Кардинальность низкая. Миллион неудаленных , тысяча удаленных записей.
30 ноя 17, 09:42    [20994347]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать грамотный индекс  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
MeGusta
Зарапартовался, прошу прощения. Кардинальность низкая. Миллион неудаленных , тысяча удаленных записей.
Да, вот я так и подумал, иначе бы и вопроса не было бы про индекс, как и упоминания этого фильтра.
30 ноя 17, 11:42    [20994771]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить