多个小查询比一个大查询快

时间:2019-04-10 18:40:58

标签: sql

下面的“大”查询运行24小时以上:

SELECT * 
FROM VIEW 
WHERE COL_A IN (a, b, c, ...) 
  AND COL_B IN (d, e, f, ...)

相反,将这个“大”查询分为多个“小”查询并同时执行它们将在30分钟内完成:

SELECT * 
FROM VIEW 
WHERE COL_A IN (a) AND COL_B IN (d)

SELECT * 
FROM VIEW 
WHERE COL_A IN (a) AND COL_B IN (e)

...

SELECT * 
FROM VIEW 
WHERE COL_A IN (b) AND COL_B IN (d)

SELECT * 
FROM VIEW 
WHERE COL_A IN (b) AND COL_B IN (e)

...

如果相关,那么“大”查询中的每个IN语句都包含约30个项目。因此,有900个唯一的“小”查询= 1个“大”查询。

请注意,VIEW定义为对VIEW_1的查询,而查询本身就是对VIEW_2的查询,而VIEW_3本身就是对EXPLAIN PLAN的查询。每个VIEW都有几百万行。

我将对视图进行反向工程,并针对我想要的内容编写自己的单个查询。但是,我没有对基础表的SELECT访问权限。

当返回的表相同时,以编程方式并行编写和执行900个不同的查询(使用的Python)似乎比一个大查询的执行速度快。为什么会这样?

已附上@Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD}) public @interface ClassifierOne { } @Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD}) public @interface ClassifierTwo { } 中的200个操作的摘要。 Explain Plan For

1 个答案:

答案 0 :(得分:1)

首先,您可以将它们作为一个查询运行:

SELECT * FROM VIEW WHERE COL_A IN (a) AND COL_B IN (d)
UNION ALL
SELECT * FROM VIEW WHERE COL_A IN (a) AND COL_B IN (e)
UNION ALL
. . .

听起来基础表在视图上有索引。您可能还可以将查询简化为:

SELECT * FROM VIEW WHERE COL_A = a AND COL_B IN (d, e, . . .)

或:

SELECT * FROM VIEW WHERE COL_A IN (a, b, . . .) AND COL_B = d