Поделиться через


Типы запросов и индексы

Обдумывая создания индекса или столбца, оцените, как столбец используется в запросах. Следующая таблица описывает типы запросов, для которых полезны индексы.

ПримечаниеПримечание

Примеры в таблице основаны на образце базы данных AdventureWorks. При запуске примеров в среде SQL Server Management Studio можно просмотреть индексы, выбранные оптимизатором запросов, отобразив действительный план выполнения. Дополнительные сведения см. в разделе Как отобразить фактический план выполнения.

Запрос, в котором предикатом столбца является один из указанных здесь

Описание и пример запроса

Индекс для рассмотрения

Точное соответствие конкретному значению

Ищет точное соответствие, в котором запрос использует предложение WHERE для указания записи в столбце с определенным значением. Например:

SELECT EmployeeID, Title 
FROM HumanResources.Employee 
WHERE EmployeeID = 228; 

Некластеризованный или кластеризованный индекс по столбцу EmployeeID.

Точное соответствие значению в списке IN (x,y,z)

Ищет точное соответствие значению в указанном списке значений. Например:

SELECT EmployeeID, Title 
FROM HumanResources.Employee 
WHERE EmployeeID IN (288, 30, 15);

Некластеризованный или кластеризованный индекс по столбцу EmployeeID.

Диапазон значений

Ищет диапазон значений, в котором запрос указывает любое вхождение, содержащее значение между двух указанных значений. Например:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID BETWEEN 1 and 5;

Или

WHERE ProductModelID >= 1 AND ProductModelID <= 5

Кластеризованный или некластеризованный индекс по столбцу ProductModelID.

Соединение таблиц

Ищет строки в таблице, совпадающие со строками в другой таблице, на основе предиката соединения. Например:

SELECT a.ProductAssemblyID, b.Name, a.PerAssemblyQty
FROM Production.BillOfMaterials AS a
JOIN Production.Product AS b 
ON a.ProductAssemblyID = b.ProductID
WHERE b.ProductID = 900;

Некластеризованный или кластеризованный индекс по столбцам ProductID и ProductAssemblyID.

Cравнение LIKE

Ищет совпадающие строки таблицы, начинающиеся с определенной символьной строки, например «abc%». Например:

SELECT CountryRegionCode, Name 
FROM Person.CountryRegion 
WHERE Name LIKE N'D%'

Некластеризованный или кластеризованный индекс по столбцу Name.

Сортировка или группировка

Требует явного или неявного порядка сортировки или группировки (GROUP BY). Например:

SELECT a.WorkOrderID, b.ProductID, a.OrderQty, a.DueDate 
FROM Production.WorkOrder AS a
JOIN Production.WorkOrderRouting AS b 
ON a.WorkOrderID = b.WorkOrderID
ORDER BY a.WorkOrderID;

Некластеризованный или кластеризованный индекс по столбцу сортировки или группировки.

Для столбцов сортировки рассмотрите указание порядка сортировки столбца ASC или DESC.

Ограничение PRIMARY KEY или UNIQUE

Ищет дубликаты ключевых значений нового индекса в операциях вставки и обновления для применения ограничений PRIMARY KEY и UNIQUE. Например:

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
VALUES ('OZ1', 'OuncesTest', GetDate());

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

Операция UPDATE или DELETE в отношении PRIMARY KEY/FOREIGN KEY

Ищет строки таблицы в операции обновления или удаления, в которых столбец участвует в отношении PRIMARY KEY/FOREIGN KEY, с параметром CASCADE или без него.

Некластеризованный или кластеризованный индекс по столбцу внешнего ключа.

Столбец присутствует в выбранном списке, но не в предикате.

Содержит один или больше столбцов в списке выбора, которые не используются для уточняющих запросов и подстановок. Например:

SELECT Title, Revision, FileName
FROM Production.Document
WHERE Title LIKE N'%Maintenance%' AND Revision >= 0';

Некластеризованный индекс с именем FileName, указанным в предложении INCLUDE.