Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
MeGusta, кластерный по OpDate. |
29 ноя 17, 14:44 [20992111] Ответить | Цитировать Сообщить модератору |
aleks222
Guest |
CREATE INDEX ... where deleted = 0 Сообщение было отредактировано: 30 ноя 17, 13:03 |
|||
29 ноя 17, 17:02 [20992934] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
aleks222, там же селективность 1 к 100, скан будет да и то, если прослушивание парамеров simple. |
29 ноя 17, 17:52 [20993189] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Что там будет ещё в индексе, зависит от запросов. Например, так: CREATE NONCLUSTERED INDEX n_indexname ON DBO.SOME_OBJECTS (OpDate) INCLUDE(поля, которые перечислены в SELECT) WHERE Deleted = 0 |
||
29 ноя 17, 18:24 [20993278] Ответить | Цитировать Сообщить модератору |
Alex_496 Member [заблокирован] Откуда: https://www.dvbi.ru Сообщений: 3869 |
кластерный по OpDate, на вырост таблицы партиционировать по OpDate, если версия ЕЕ columnstore index - проверить на запросах, смотря что и как часто выбирается |
29 ноя 17, 18:37 [20993315] Ответить | Цитировать Сообщить модератору |
Mind Member Откуда: Лучший город на Земле Сообщений: 2322 |
WHERE Deleted = @Deleted
все равно использовать этот индекс не смогут, как впрочем и любые другие запросы без правильного фильтра. В итоге имеем индекс который экономит нам 0.01% места на диске, но абсолютно безсмысленный для любых запросов в которых нет нужного фильтра. Я бы сказал, что если есть возможность избежать лукапов по всем полям которые в селекте, то можно добавить Deleted в INCLUDE (в сам ключ индекса безсмысленно по сути, использоваться все равно не будет), а если лукапы все равно неизбежны, то я бы даже не стал заморачиваться. |
||||
30 ноя 17, 02:22 [20994094] Ответить | Цитировать Сообщить модератору |
iii2 Member Откуда: Сообщений: 202 |
С 2016SP1 уже можно и в стандарте! |
||
30 ноя 17, 08:17 [20994221] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Я полагал, что записей с DELETED = 0 в таблице 0.001 от общего количества записей, я так понял высказывание:
Если же по фильтру действительно 99% строк, то лучший вариант кластерный по дате, или, если в select узкий набор, то можно рассмотреть некластерный по дату с INCLUDE нужных полей |
||||
30 ноя 17, 09:03 [20994261] Ответить | Цитировать Сообщить модератору |
MeGusta
Guest |
Зарапартовался, прошу прощения. Кардинальность низкая. Миллион неудаленных , тысяча удаленных записей. |
30 ноя 17, 09:42 [20994347] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
30 ноя 17, 11:42 [20994771] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |