如何同时运行两个慢速SQL SELECT语句

时间:2013-11-27 00:30:40

标签: sql oracle plsql

在SQL中,有没有办法同时运行多个SELECT语句,然后加入结果?我在互联网上看到的大多数例子似乎都涉及SELECT语句以顺序方式运行,其次是JOIN和其他语句。

代码的示例如下所示:

SELECT x, y FROM Table apples WHERE ... as t1
left join
    (SELECT x, y FROM Table oranges WHERE ... as t2)
on
     t1.x = t2.x

现在想象SELECT x, y FROM Table apples WHERE ... as t1需要很长时间。如何同时运行上述两个SELECT语句(例如,类似于Java或C#中的线程调用)以节省时间?或者Oracle已经这样做了吗?

干杯

3 个答案:

答案 0 :(得分:3)

可以在没有连接或子查询的单个查询中完成所有操作:

  SELECT ks,
         COUNT(*) AS '# Tasks',
         SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) AS '# Late'
    FROM Table
GROUP BY ks

作为可能的性能改进,值得尝试创建复合(ks, Age, Palt)索引

答案 1 :(得分:3)

不,Oracle不会同时执行它们。它最接近的是并行查询,其中单个查询的各个阶段可以自动分配到多个并行查询会话,并且结果由查询协调器会话组合。

您可以尝试将多个查询的逻辑组合成一个(如zerkms建议的那样)并优化查询以使用覆盖索引(例如) - 换句话说,用于执行速度慢的查询的标准方法。

组合单独执行的查询结果的一个潜在致命问题是它们不一致。除非您使用闪回查询来获得稍微过时的结果,否则每个查找一致数据的时间点通常会略有不同。

如果数据是静态的,那么您可以使用DBMS_Scheduler在加载到公共表的同时运行多个查询,然后从那里进行选择。 DBMS_Scheduler可以定义可以串行或并行执行的进程链,并提供非常复杂的结束条件检查,以确定何时应执行哪些步骤。虽然它是一个很大的锤子,但通常用于批量处理(例如数据仓库ELT流程)。

答案 2 :(得分:1)

Oracle 12c允许concurrent execution of union all。这仍然不会并行执行执行计划的每个步骤,但它可以更接近。

然而,几乎从不需要该功能。常规并行查询能够将所有可用系统资源用于单个查询。

如果APPLES和ORANGES足够大,那么为每个表划分的工作量很大。并且一些操作(例如排序和散列)将同时完成。这就是为什么Oracle有时会分配两倍于所请求的并行度的并行服务器。

如果APPLES和ORANGES很小,则数据库必须担心同时运行多个查询。对于不需要很长时间的事情,不值得启动和协调多个线程。