2014-07-26 31 views
6

我試圖執行以下命令來強制更新使用一個非聚集索引:SQL Server - 如何提示更新命令的索引?

UPDATE Flights 
SET Airtime=5555678 
WHERE Distance=10000 
OPTION (TABLE HINT(Flights, INDEX (DistanceIndex))) 

...和它的示數:

消息8724,級別16,狀態1,第75行
無法執行查詢。表值或OPENROWSET函數'Flights'不能在TABLE HINT子句中指定。

對於TABLE HINT語句中的語法應該如何正確形成,我找不到任何明確的建議。

請誰能告訴我哪裏出錯了?

回答

7

嘗試以下操作:

UPDATE F 
SET F.Airtime=5555678 
FROM Flights F WITH (INDEX (DistanceIndex)) 
WHERE F.Distance=10000 

UPDATE Flights 
SET Airtime=5555678 
FROM Flights -- this line is added to your initial query 
WHERE Distance=10000 
OPTION (TABLE HINT(Flights, INDEX (DistanceIndex))) 
+0

非常感謝您的意見。上述兩種方法都適用於我,對執行計劃有相同的影響。親切的問候,Jon – Jon295087

4

@我,一個人的答案是正確和推薦的方式。

您也可以

UPDATE F 
SET Airtime = 5555678 
FROM Flights F 
WHERE Distance = 10000 
OPTION (TABLE HINT(F, INDEX (DistanceIndex))) 

But the documentation states

我們建議僅在計劃指南的上下文中使用INDEX,FORCESCAN或FORCESEEK表提示作爲 查詢提示使用。

+0

@ MartinSmith-非常感謝您的意見。感謝這種方法違背最佳實踐 - 我只是有興趣注意到操作中的性能差異,如果我可以強制使用[效率較低的]二級索引。我進一步閱讀FORCESCAN和FORCESEEK的使用,因爲我沒有看過這些方法。親切的問候,喬恩 – Jon295087