Должен ли я включить все мои столбцы из выбора в моем индексе?

У меня есть запрос, который занимает немного времени, чтобы выглядеть так.

Select a.ColumnA,a.ColumnB,a.ColumnC,a.CoulmnD,a.columnE,...b.ColumnH
from Table A a
  inner join Table B b
       on a.columnB = b.ColumnB
  Where a.columnA = @VariableA

Теперь у него есть кластерный индекс в таблице А, как это

Clustered Index on ColumnA

Он также имеет некластеризованный индекс в таблице A, например

NonClustered Index on (ColumnA,ColumnB) include (ColumnC,ColumnD)

Должен ли я добавить в индекс ColumnsE-G?

1 ответ

Решение

Убедитесь, что тип данных сравниваемых столбцов и параметров совпадают, когда вы видите сканирование индекса вместо ожидаемого поиска в плане выполнения.

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

Другие вопросы по тегам