为什么这个优势数据库查询需要这么长时间?

Why does this Advantage Database query take so long?

首先,Orders.Order_Number、OrderDet.Order_Number 和 OrderDet.PatID 上有索引。还有其他指数,但这些指数对我来说是相关的。

在我进行的测试中,执行此查询需要 20 到 114

Update O
   SET O.BenefitID = 1,
       O.LastChangedBy = 'RH Test' 
   FROM Orders O
   JOIN OrderDet od ON od.Order_Number = O.Order_Number
   WHERE
         Od.PatID = 703007
         and Od.Status IN ('2', '7', '50', '51', '52', '78', '82');

如果我改为这样做,我得到的时间不到 60 毫秒:

SELECT ODetailID, Order_Number INTO #OrdNum FROM OrderDet 
   WHERE PatID = 703007
   AND Status IN ('2', '7', '50', '51', '52', '78', '82');  
Update Orders
   SET BenefitID = 1,
       LastChangedBy = 'RH Test' 
   WHERE Order_Number in (SELECT Order_Number from #OrdNum);        

   DROP TABLE #OrdNum;

有人能告诉我为什么在将 OrderDet table 加入 Orders 时我的查询需要这么长时间吗?加入需要这么长时间对我来说没有意义。如果我在 table 上 select 基于 order_number,我得到不到 200 毫秒的响应。如果我在 OrderDet 上使用 PatID select,我得到不到 40 毫秒的响应。按 PatId 选择订单需要更长的时间 - 1-2 秒,但该列上没有索引。我不明白为什么连接最多需要 114 秒,因为连接位于在两个 table 中索引的列上。非常感谢任何有助于理解这一点的帮助。

此行为的原因是因为在使用连接执行更新操作时,被更新的 table 被固定为嵌套循环连接的驱动 table。由于订单 table 没有直接条件,因此 table 扫描是唯一的选择。

在带有两个 tables 内部连接的 SELECT 查询中,tables 可能会被切换为将具有更多限制性结果的 table 作为驱动程序.这会带来更优化的性能。

使用临时 table 的替代方法是使用更标准的子查询:

Update Orders
   SET BenefitID = 1,
       LastChangedBy = 'RH Test' 
   WHERE Order_Number in 
       (SELECT Order_Number 
        FROM OrderDet 
        WHERE PatID = 703007
        AND Status IN ('2', '7', '50', '51', '52', '78', '82'));