加入2个脚本的SQL性能ORACLE

时间:2017-09-06 08:20:16

标签: sql oracle performance

我有两个相当复杂的脚本,一个是我个人写的,另一个是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+分钟。 我想知道为什么会发生这样的事情,当脚本1和脚本2分别在大约30秒内分别运行时,但是当一起运行时,多达10+ 还有另一种方法可以实现吗?

2 个答案:

答案 0 :(得分:2)

您可以在加入这些表之前创建临时表。

首先创建表 temp1 作为select * from script1

并创建表 temp2 作为select * from script2

然后选择您的查询

SELECT temp1.*, temp2.COMPUTED_INFO FROM temp1 TABLE1 LEFT JOIN temp2 TABLE2 ON temp2.ID = temp1.ID

答案 1 :(得分:2)

上次我遇到这种问题时,我用临时表解决了这个问题。我用SCRIPT1和SCRIPT2结果创建了临时表。然后向ID列添加索引。

在此之后,与您的查询类似的查询必须执行得更快。

这发生在postgresql服务器上,但问题的根是一样的。通常,RDBMS无法从PROCEDURE / FUNCTION优化子查询/结果集,也不能在其行上使用索引。