資料表提示會在 DML 陳述式的 FROM 子句中指定,並只會影響該子句中參考的資料表或檢視表。
|
|
|---|
|
由於 SQL Server 查詢最佳化工具通常會選取最好的查詢執行計畫,因此,我們建議資深的開發人員和資料庫管理員只將提示當做最後的解決辦法。 |
適用於:
Transact-SQL 語法慣例
WITH ( <table_hint> [ [, ]...n ] )
<table_hint> ::=
[ NOEXPAND ] {
INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value ) | FORCESEEK [( index_value ( index_column_name [ ,... ] ) ) ]
| FORCESCAN
| FORCESEEK
| HOLDLOCK
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| SPATIAL_WINDOW_MAX_CELLS = integer
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
<table_hint_limited> ::=
{
KEEPIDENTITY
| KEEPDEFAULTS
| HOLDLOCK
| IGNORE_CONSTRAINTS
| IGNORE_TRIGGERS
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
在後面一種情況中,您可以利用 OPTION (EXPAND VIEWS) 查詢提示來防止存取索引檢視表。
另外,SQL Server 也會執行對應的鎖定一致性檢查。
例如,如果資料表有非叢集索引,且使用鎖定提示的 SELECT 陳述式是由涵蓋索引來處理,就會取得此涵蓋索引之索引鍵的鎖定,而不是基底資料表之資料列的鎖定。
當存取運算式和函數所參考的資料表時,它們不會使用 NOLOCK 資料表提示。
SQL Server 不允許 FROM 子句中每份資料表的下列每個群組,都有一個以上的資料表提示:
-
資料粒度提示:PAGLOCK、NOLOCK、READCOMMITTEDLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。
-
隔離等級提示:HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE。
已篩選的索引提示
建立篩選的索引>。
USE AdventureWorks2012;
GO
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIBillOfMaterialsWithComponentID'
AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithComponentID
ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"
ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)
WHERE ComponentID IN (533, 324, 753);
GO
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
WITH( INDEX (FIBillOfMaterialsWithComponentID) )
WHERE ComponentID in (533, 324, 753, 855, 924);
GO
CREATE INDEX (Transact-SQL)>。
使用 NOEXPAND
SQL Server 2012 版本支援的功能 (http://go.microsoft.com/fwlink/?linkid=232473)。
不過,若要使最佳化工具考慮比對索引檢視表,或使用 NOEXPAND 提示所參考的索引檢視表,下列 SET 選項必須設為 ON。
|
ANSI_NULLS |
ANSI_WARNINGS |
CONCAT_NULL_YIELDS_NULL |
|
ANSI_PADDING |
1 |
QUOTED_IDENTIFIERS |
因此,您不需要手動調整這個設定。
另外,NUMERIC_ROUNDABORT 選項必須設成 OFF。
SQL Server 不會提供提示強制在未在 FROM 子句直接指定檢視名稱的查詢中使用特定的索引檢視,但即使查詢中未直接參考索引檢視,查詢最佳化工具仍會使用索引檢視。
將資料表提示當做查詢提示使用
查詢提示 (Transact-SQL)>。
KEEPIDENTITY、IGNORE_CONSTRAINTS 和 IGNORE_TRIGGERS 提示需要資料表的 ALTER 權限。
A.使用 TABLOCK 提示指定鎖定方法
Production.Product 資料表上採用共用鎖定,並且將鎖定保留到 UPDATE 陳述式結束為止。
B.使用 FORCESEEK 提示指定索引搜尋作業
Sales.SalesOrderDetail 資料表執行索引搜尋作業。
下列範例會使用 FORCESEEK 提示搭配索引,強制查詢最佳化工具對指定的索引和索引資料行執行索引搜尋作業。
USE AdventureWorks2012; GO SELECT h.SalesOrderID, h.TotalDue, d.OrderQty FROM Sales.SalesOrderHeader AS h INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID))) ON h.SalesOrderID = d.SalesOrderID WHERE h.TotalDue > 100 AND (d.OrderQty > 5 OR d.LineTotal < 1000.00); GO
C.使用 FORCECAN 提示指定索引掃描作業
下列範例會使用 FORCESCAN 提示,強制查詢最佳化工具對 Sales.SalesOrderDetail 資料表執行掃描作業。