Как правильно включить правильные столбцы в индекс SQL - PullRequest
0 голосов
/ 24 октября 2019

Я изо всех сил пытаюсь получить правильный индекс для небольшого запроса, который я хочу выполнить. Мне было интересно, если у кого-нибудь есть какие-либо советы для такого рода запросов?

Мои столбцы таблицы:

Id int (not used in query) PK
DateField datetime
IntField1 int
IntField2 int
IntField3 int
IntField4 int
IntField5 int (Not used in query)
IntField6 int (Not used in query)

Мой запрос выглядит так

DECLARE @datefield datetime = '2019-01-01';
DECLARE @intfield1 int 1;
DECLARE @intfield2 int 2;

SELECT
SUM([sum])
FROM table1
WHERE 
DATEPART(YEAR, [DateField]) = DATEPART(YEAR, @datefield)
AND DATEPART(MONTH, [DateField]) = DATEPART(MONTH, @datefield)
AND [IntField1] = @intfield1
AND [IntField2] = @intfield2
AND [IntField3] = [IntField4]

ЛучшийИндекс, который я нашел в плане выполнения, выглядит так:

CREATE INDEX idx_test_1 ON table1([DateField], [IntField1])

Я также пытался что-то вроде этого ...

CREATE INDEX idx_test_2 ON table1([DateField], [IntField1], [IntField2], [IntField3], [IntField4]) 

Но это оказалось хуже при исполненииplan

Я пытался следовать этому руководству, но любая другая помощь будет полезна.

https://www.sqlshack.com/sql-server-index-design-basics-and-guidelines/

Вот план выполнения для запроса

https://www.brentozar.com/pastetheplan/?id=SyW3LQk5r

1 Ответ

1 голос
/ 24 октября 2019

Функция на [DFateField] делает индекс бесполезным. Вам необходимо изменить условие:

DATEPART(YEAR, [DateField]) = DATEPART(YEAR, @datefield)
AND DATEPART(MONTH, [DateField]) = DATEPART(MONTH, @datefield)

Вам необходимо переписать запрос, чтобы сравнить поле [DateField] напрямую с параметрами.

Оба индекса должны работать. Но в зависимости от избирательности индекс test1 может быть достаточно хорошим.

Вы можете рассчитать диапазон дат для месяца:

DECLARE @start_month date;
DECLARE @end_month date;

SET @start_month=DATEADD(DAY,1-DATEPART(DAY, @datefield),@datefield);
SET @end_month=DATEADD(MONTH,1,@start_month);

Затем измените указанное выше условие на:

[DateField] >= @start_month  AND [DateField] < @end_month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...