我有两个很复杂的剧本,一个是我自己写的,另一个是十年前写的。第一个脚本获得必要的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+ min。
我也试过
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+一样多,还有其他方法来完成吗?
发布于 2017-09-06 08:27:23
您可以在joı之前创建临时表。
首先将表temp1作为select *从script1创建
并将表temp2作为select *从script2创建
然后选择查询
SELECT temp1.*, temp2.COMPUTED_INFO FROM temp1 TABLE1 LEFT JOIN temp2 TABLE2 ON temp2.ID = temp1.ID发布于 2017-09-06 08:31:38
上一次,当我遇到这样的问题时,我用一张临时桌子解决了它。我创建了带有SCRIPT1和SCRIPT2结果的临时表。然后将索引添加到ID列中。
在此之后,与您类似的查询必须执行得更快。
这种情况发生在postgresql服务器上,但问题的根源是相同的。通常,RDBMS无法从过程/函数中优化子查询/结果集,并且不能对其行使用索引。
https://stackoverflow.com/questions/46070170
复制相似问题