我有两个相当复杂的脚本,一个是我个人写的,另一个是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+ 还有另一种方法可以实现吗?
答案 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优化子查询/结果集,也不能在其行上使用索引。