为什么这个优势数据库查询需要这么长时间?
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'));
首先,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'));