【问题标题】:SQL Server - How to Hint an Index on an Update command?SQL Server - 如何在更新命令上提示索引?
【发布时间】:2014-09-18 11:11:48
【问题描述】:

我正在尝试执行以下命令来强制更新使用非聚集索引:

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

...它出错了:

消息 8724,第 16 级,状态 1,第 75 行
无法执行查询。不能在 TABLE HINT 子句中指定表值或 OPENROWSET 函数“Flights”。

我找不到任何关于如何在TABLE HINT 语句中正确形成语法的明确建议。

谁能告诉我哪里出错了?

【问题讨论】:

    标签: sql-server sql-update hint


    【解决方案1】:

    尝试以下操作:

    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)))
    

    【讨论】:

    • 非常感谢您的 cmets。上述两种方法都对我有用,对执行计划的影响相同。亲切的问候,乔恩
    【解决方案2】:

    @i-one 的回答是正确的,推荐的方式。

    你也可以使用

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

    But the documentation states

    我们建议使用 INDEX、FORCESCAN 或 FORCESEEK 表提示作为 查询提示仅在计划指南的上下文中。

    【讨论】:

    • @MartinSmith-非常感谢您的 cmets。欣赏这种方法违反最佳实践 - 如果我可以强制使用[效率较低的]二级索引,我只是想注意操作中的性能差异。我进一步阅读了 FORCESCAN 和 FORCESEEK 的使用,因为我没有看过这些方法。亲切的问候,乔恩
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多