当您考虑是否要对列创建索引时,请估计在查询中使用列的方式。下表介绍了索引对其有用的查询类型。
表中的示例基于 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 列的聚集索引或非聚集索引。
|
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());
|
约束中定义的列的聚集索引或非聚集索引。 |
PRIMARY KEY/FOREIGN KEY 关系中的 UPDATE 或 DELETE 操作 |
在列参与 PRIMARY KEY/FOREIGN KEY 关系(无论带不带 CASCADE 选项)的更新或删除操作中搜索行。 |
外键列的非聚集索引或聚集索引。 |
列在选择列表中,但不在谓词中。 |
包含选择列表中未用于搜索和查找的一列或多列。例如:
SELECT Title, Revision, FileName
FROM Production.Document
WHERE Title LIKE N'%Maintenance%' AND Revision >= 0';
|
在 INCLUDE 子句中指定了 FileName 的非聚集索引。 |
请参阅
概念
常规索引设计指南
具有包含性列的索引
帮助和信息
获取 SQL Server 2005 帮助