план выполнения, предлагающий добавить индекс по столбцам, которые не являются частью предложения where - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю следующий запрос в SSMS и план выполнения, предлагающий добавить индекс для столбцов, которые не являются частью предложения where. Я планировал добавить индекс по двум столбцам, которые используются в предложении where (OID и TransactionDate).

SELECT  
        [OID] , //this is not a PK. Primary key column is not a part of sql script
        [CustomerNum] ,
        [Amount] ,
        [TransactionDate] ,
        [CreatedDate] 

FROM    [dbo].[Transaction]
WHERE   OID = 489
        AND TransactionDate > '01/01/2018 06:13:06.46';

Индекс предложения

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Transaction] ([OID],[TransactionDate])
INCLUDE ([CustomerNum],[Amount],[CreatedDate])

Обновлено

Нужно ли включать другие столбцы? Данные импортируются в эту таблицу через внутренний процесс с использованием класса SQLBulkCopy в .net. Мне интересно, если бы не кластерный индекс для всех столбцов снизил бы производительность. (В моей таблице есть столбец Pk с именем TransactionID, который не нужен, но у меня есть это в таблице на случай, если это потребуется в будущем, иначе SQLBulkCopy лучше работает с кучей. Другой вариант - удалять и воссоздавать индексы до и после операции SQLBulkCopy)

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вам не нужно добавлять все столбцы таблицы в некластеризованный индекс, предлагаемый индекс подходит для указанного запроса. Предложения ядра СУБД SQL Server обычно действительно хороши.

ВКЛЮЧИТЬ ключевое слово, необходимое для того, чтобы избежать КЛЮЧЕВОГО ВЗГЛЯДА и использовать НЕКЛАСТЕРНЫЙ ПОИСК ПОИСКА.

В целом: отсутствие необработанного индекса приводит к сканированию кластерного индекса

Создание НЕКЛАСТЕРНОГО ИНДЕКСА без включенных столбцов приводит к сканированию НЕКЛАСТЕРНОГО ИНДЕКСА и поиску ключа.

Создание НЕКЛАСТЕРНОГО ИНДЕКСА с включенными столбцами приводит к НЕКЛАСТЕРНОМУ ИНДЕКСУ SEEK.

0 голосов
/ 29 октября 2018

ключевое слово INCLUDE указывает неключевые столбцы, которые будут добавлены к конечному уровню некластеризованного индекса.

Это означает, что если вы добавите этот индекс и снова выполните запрос, SQL Server сможет получить всю необходимую информацию из индекса, что устраняет необходимость выполнять поиск в таблице.

Как правило, когда SSMS предлагает индекс, создайте его. Вы всегда можете уронить его позже, если это не поможет.

...