2

为什么将 "IN" 与 "OPERATOR <" 结合使用会比单独使用 "IN" 子句带来更好的结果?

我有一个包含数百万条记录的移动表,当我单独使用“IN”子句运行查询时需要几分钟才能完成。但是当我添加“AND Product_ID < 400000”时只需要几秒钟

谁能解释我为什么会发生这种情况?

(Product_ID有索引,最大Id号小于390000)

慢代码:

SELECT 
   Product_ID,
   Product_Name,
   Product_Cost
FROM Products
WHERE Product_ID IN (1,10,100,1000)
UNION
SELECT 
   Product_ID,
   Product_Name,
   Product_Cost
FROM Products_Hist
WHERE Product_ID IN (1,10,100,1000)

快速代码:

SELECT 
   Product_ID,
   Product_Name,
   Product_Cost
FROM Products
WHERE Product_ID IN (1,10,100,1000)
      AND Product_ID < 400000
UNION
SELECT 
   Product_ID,
   Product_Name,
   Product_Cost
FROM Products_Hist
WHERE Product_ID IN (1,10,100,1000)
     AND Product_ID < 400000
4

1 回答 1

0

时间差异在于全表扫描与索引范围扫描。使用索引会首先删除大量候选对象,然后再应用 IN 计算来过滤结果。

你知道使用像 tkprof 这样的分析器吗?或解释计划?如果您的查询可能运行良好,这些将提前告诉您。

创建两个 EXPLAIN PLAN 运行,每个查询一个以查看发生了什么。如果您不知道该怎么做,我们可以提供帮助。

于 2013-10-21T23:44:30.293 回答