【发布时间】:2017-09-06 08:20:16
【问题描述】:
我有两个脚本,很复杂,一个是我自己写的,另一个是 10 年前写的。第一个脚本获取必要的 id 并在大约 30 秒内执行,例如:
| ID | some other info ...
+----+--------------------
| 1 | ...
| 2 | ...
| 3 | ...
| 4 | ...
第二个脚本获取的是一些比较复杂的数据,是通过很多子查询计算出来的,执行时间大概在30秒左右,例如:
| ID | Computed Info
+----+--------------------
| 1 | 111
| 2 | 222
| 3 | 333
| 4 | 444
现在我的 script1 需要包含来自 script2 的部分结果,因为 script2 非常复杂,很难分解必要的部分,这就是为什么我尝试使用 ID 将 script2 的连接结果留给 script1
SELECT TABLE1.*, TABLE2.COMPUTED_INFO FROM SCRIPT1 TABLE1 LEFT JOIN SCRIPT2 TABLE2 ON TABLE2.ID = TABLE1.ID
我得到的结果也是预期的结果是:
| ID | some other info ... | Computed Info
+----+---------------------+---------------
| 1 | ... | 111
| 2 | ... | 222
| 3 | ... | 333
| 4 | ... | 444
问题是在加入他们两个之后,执行时间现在是 20+ 分钟。
我也试过了
with table1 as
(script1),
table2 as
(script2)
select t1.*, t2.computed_data
from table1 t1 left join table2 t2 on t2.id = t1.id
这导致了 10+ 分钟。 我想知道为什么会发生这样的事情,当绝对 script1 和 script2 分别在大约 30 秒内分别运行时,但是当一起运行时,运行时间高达 10+ 还有其他方法可以实现吗?
【问题讨论】:
-
您是否尝试过在查询中运行EXPLAIN PLAN?输出是什么?
-
@markusk 我没有,应该知道
-
@markusk 对于有问题的脚本2 我没有得到任何结果,并得到错误,指出超出了空间配额,对于它执行的脚本1,我应该从 plan_table 中注意哪一列?跨度>
-
有趣的部分不是
script1和script2的单独执行计划,而是连接的执行计划。我怀疑您的问题是由script1和script2返回的大量行以及没有索引引起的。如果您可以display the explain plan 并将输出复制到您的问题中,那将有助于分析您的问题。
标签: sql oracle performance