查詢類型和索引

當您考慮是否要在資料行上建立索引時,請先評估要如何在查詢中使用資料行。下表描述索引非常有用的查詢類型。

[!附註]

在資料表中的範例是以 AdventureWorks2008R2 範例資料表為基礎。當您在 SQL Server Management Studio 中執行範例時,您可以顯示實際的執行計畫,以檢視查詢最佳化工具所選取的索引。如需詳細資訊,請參閱<如何:顯示實際執行計畫>。

資料行述詞為下列其中一個的查詢

查詢描述和範例

要考慮的索引

完全符合特定值

所謂完全符合的搜尋,是指查詢使用 WHERE 陳述式來指定一個具有指定值的資料行項目。例如:

SELECT BusinessEntityID, JobTitle 
FROM HumanResources.Employee 
WHERE BusinessEntityID = 228; 

在 BusinessEntityID 資料行上的非叢集或叢集索引。

與 IN (x,y,z) 清單中的值完全相符

搜尋與指定的值清單中完全相符的值。例如:

SELECT BusinessEntityID, JobTitle 
FROM HumanResources.Employee 
WHERE BusinessEntityID IN (288, 30, 15);

在 BusinessEntityID 資料行上的非叢集或叢集索引。

範圍值

針對查詢所指定的介於兩個值之間的值項目搜尋某個範圍的值。例如:

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 作業

在更新或刪除作業中搜尋資料列,其中資料行參與有或沒有 CASCADE 選項的 PRIMARY KEY/FOREIGN KEY 關聯性。

在外部索引鍵資料行上的非叢集或叢集索引。

資料行是在選取清單中不在述詞中。

包含選取清單中的一或多個資料行,未用於搜尋和查閱。例如:

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

在 INCLUDE 子句中指定含有 FileName 的非叢集索引。