Sql-Server

FORCESEEK 查詢提示是否可以用於連結伺服器上正在查詢的表?(即作為分佈式查詢的一部分)

  • January 6, 2020

我有一個使用 FORCESEEK 提示的查詢,並且在我查詢的數據庫所在的伺服器上執行良好。如果我嘗試從不同的伺服器(針對原始伺服器)遠端執行相同的精確查詢,我會收到以下錯誤:

消息 7436,級別 16,狀態 1,第 4 行查詢處理器無法生成查詢計劃,因為表或視圖“TableBeingQueried”上的 FORCESEEK 或 FORCESCAN 提示不能用於遠端數據源。刪除提示並重新送出查詢。

範例 T-SQL:

SELECT DISTINCT Table3.Field5
FROM Server1.Database1.Table1 AS T1
INNER JOIN Server1.Database1.Table2 AS T2 WITH (FORCESEEK) -- Index exists for T2.Field2
   ON T1.Field1 = T2.Field2
INNER JOIN Server1.Database1.Table3 AS T3 WITH (FORCESEEK) -- Index exists for T3.Field3
   ON T2.Field4 = T3.Field3

您可以使用OPENQUERY()能夠查詢連結伺服器並應用FORCESEEK/FORCESCAN提示。

例子:

SELECT * FROM
OPENQUERY(
[Server1],
'SELECT DISTINCT Table3.Field5
FROM Server1.Database1.Table1 AS T1
INNER JOIN Server1.Database1.Table2 AS T2 WITH (FORCESEEK) -- Index exists for T2.Field2
   ON T1.Field1 = T2.Field2
INNER JOIN Server1.Database1.Table3 AS T3 WITH (FORCESEEK) -- Index exists for T3.Field3
   ON T2.Field4 = T3.Field3;');

您不能在遠端數據源上使用 FROCESCAN 或 FORCESEEK。

參考:提示 (Transact-SQL) - 表

FORCESCAN 提示具有以下限制:

無法為遠端數據源指定提示。

使用 FORCESEEK 提示(帶或不帶索引參數)時,請考慮以下準則:

無法為遠端數據源指定提示。使用索引提示指定 FORCESEEK 時返回錯誤 7377,而在沒有索引提示的情況下使用 FORCESEEK 時返回錯誤 8180。

引用自:https://dba.stackexchange.com/questions/256680