powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите сделать грамотный индекс
11 сообщений из 11, страница 1 из 1
Помогите сделать грамотный индекс
    #39561296
MeGusta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Есть таблица примерно такая
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE DBO.SOME_OBJECTS (
Id uniqueidentifier primary key,
OpDate datetime,
....
Deleted bit 

) 


В ней пара миллионов записей. К ней будет много селектов типа
Код: sql
1.
WHERE OpDate BETWEEN @SDate AND @EDate AND @Deleted = 0  

или много джойнов по ID, но с условием DELETED = 0
По датам селективность высокая, по DELETED очень низкая.

Помогите, пожалуйста, сделать наиболее эффективных индексов.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 /*такой? */
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) 

/*Или вообще что-то другое? */
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561301
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MeGusta,

кластерный по OpDate.
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561439
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MeGusta
Код: sql
1.
/*Или вообще что-то другое? */



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

Код: sql
1.
CREATE INDEX ... where deleted = 0
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561496
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

там же селективность 1 к 100, скан будет да и то, если прослушивание парамеров simple.
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561530
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовaleks222,

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

Что там будет ещё в индексе, зависит от запросов.
Например, так:
Код: sql
1.
CREATE NONCLUSTERED INDEX n_indexname  ON  DBO.SOME_OBJECTS (OpDate) INCLUDE(поля, которые перечислены в SELECT) WHERE Deleted = 0
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561551
Фотография Alex_496
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кластерный по OpDate,
на вырост таблицы партиционировать по OpDate, если версия ЕЕ
columnstore index - проверить на запросах, смотря что и как часто выбирается
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561681
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВладислав Колосовaleks222,

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

Что там будет ещё в индексе, зависит от запросов.
Например, так:
Код: sql
1.
CREATE NONCLUSTERED INDEX n_indexname  ON  DBO.SOME_OBJECTS (OpDate) INCLUDE(поля, которые перечислены в SELECT) WHERE Deleted = 0

Если по фильтру 99% строк, то какой смысл от этого фильтра? Правильно. Никакого. Да и запросы типа
Код: sql
1.
WHERE Deleted = @Deleted


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


Я бы сказал, что если есть возможность избежать лукапов по всем полям которые в селекте, то можно добавить Deleted в INCLUDE (в сам ключ индекса безсмысленно по сути, использоваться все равно не будет), а если лукапы все равно неизбежны, то я бы даже не стал заморачиваться.
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561724
iii2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_496кластерный по OpDate,
на вырост таблицы партиционировать по OpDate, если версия ЕЕ
columnstore index - проверить на запросах, смотря что и как часто выбирается
С 2016SP1 уже можно и в стандарте!
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561737
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MindЕсли по фильтру 99% строк, то какой смысл от этого фильтра? Правильно. Никакого. Да и запросы типаЭэээ, наверное, я не так понял задачу.
Я полагал, что записей с DELETED = 0 в таблице 0.001 от общего количества записей, я так понял высказывание:
MeGustaПо датам селективность высокая, по DELETED очень низкая.

Если же по фильтру действительно 99% строк, то лучший вариант кластерный по дате, или, если в select узкий набор, то можно рассмотреть некластерный по дату с INCLUDE нужных полей
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561754
MeGusta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зарапартовался, прошу прощения. Кардинальность низкая. Миллион неудаленных , тысяча удаленных записей.
...
Рейтинг: 0 / 0
Помогите сделать грамотный индекс
    #39561845
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MeGustaЗарапартовался, прошу прощения. Кардинальность низкая. Миллион неудаленных , тысяча удаленных записей.Да, вот я так и подумал, иначе бы и вопроса не было бы про индекс, как и упоминания этого фильтра.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите сделать грамотный индекс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]