表提示

表提示用于在数据操作语言 (DML) 语句中替代查询优化器的默认行为。 可以指定锁定方法、一个或多个索引、查询处理操作(如表扫描或索引查找),或其他选项。 表提示在 DML 语句的 FROM 子句中指定,仅影响在该子句中引用的表或视图。
注意 由于 SQL Server 查询优化器通常会为查询选择最佳执行计划,因此我们建议仅在最后迫不得已的情况下才可由资深的开发人员和数据库管理员使用提示。

使用NOLOCK可以读取锁定数据,但存在脏读。

1.无论是否允许使用 WITH 关键字,都可以使用以下表提示:NOLOCK、READUNCOMMITTED、UPDLOCK、REPEATABLEREAD、SERIALIZABLE、READCOMMITTED、TABLOCK、TABLOCKX、PAGLOCK、ROWLOCK、NOWAIT、READPAST、XLOCK、SNAPSHOT 和 NOEXPAND。 如果指定的表提示不含 WITH 关键字,则必须单独指定该提示。 例如:

SQL

复制
FROM t (TABLOCK)
如果指定的提示含其他选项,则指定的提示必须含 WITH 关键字:

SQL

复制
FROM t WITH (TABLOCK, INDEX(myindex))

2.使用 TABLOCK 提示指定锁定方法
下面的示例指定对 AdventureWorks2022 数据库中的 Production.Product 表采用共享锁,并保持到 UPDATE 语句结束。

SQL

复制
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
B. 使用 FORCESEEK 提示指定索引查找操作
以下示例使用未指定索引的 FORCESEEK 提示强制查询优化器对 AdventureWorks2022 数据库中的 Sales.SalesOrderDetail 表执行索引查找操作。

SQL

复制
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);
GO
以下示例使用指定索引的 FORCESEEK 提示强制查询优化器对指定的索引和索引列执行索引查找操作。

SQL

复制
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. 使用 FORCESCAN 提示指定索引扫描操作
以下示例使用 FORCESCAN 提示强制查询优化器对 AdventureWorks2022 数据库中的 Sales.SalesOrderDetail 表执行扫描操作。

SQL

复制
SELECT h.SalesOrderID, h.TotalDue, d.OrderQty
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
WITH (FORCESCAN)
ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);

posted @ 2024-05-14 11:09  自在现实  阅读(20)  评论(0)    收藏  举报