首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接2个脚本的SQL性能

连接2个脚本的SQL性能
EN

Stack Overflow用户
提问于 2017-09-06 08:20:16
回答 2查看 52关注 0票数 0

我有两个很复杂的剧本,一个是我自己写的,另一个是十年前写的。第一个脚本获得必要的id,并在大约30秒内执行,例如:

代码语言:javascript
复制
| ID | some other info ...
+----+--------------------
| 1  |       ...
| 2  |       ...
| 3  |       ...
| 4  |       ...

第二个脚本获得了一些更复杂的数据,这些数据是通过许多子查询计算出来的,大约在30秒内执行,例如:

代码语言:javascript
复制
| ID | Computed Info
+----+--------------------
| 1  |       111
| 2  |       222
| 3  |       333
| 4  |       444

现在我的script1需要包含一些来自script2的部分结果,因为script2非常复杂,很难分解必要的部分,这就是为什么我尝试使用ID将script2的联接结果留给script1的原因

代码语言:javascript
复制
SELECT TABLE1.*, TABLE2.COMPUTED_INFO FROM SCRIPT1 TABLE1 LEFT JOIN SCRIPT2 TABLE2 ON TABLE2.ID = TABLE1.ID

我得到的结果以及预期的结果是:

代码语言:javascript
复制
| ID | some other info ... | Computed Info
+----+---------------------+---------------
| 1  |       ...           |  111
| 2  |       ...           |  222
| 3  |       ...           |  333
| 4  |       ...           |  444

问题是,在将两者都加入之后,执行的时间现在是20+ min。

我也试过

代码语言:javascript
复制
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+一样多,还有其他方法来完成吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-06 08:27:23

您可以在joı之前创建临时表。

首先将表temp1作为select *从script1创建

并将表temp2作为select *从script2创建

然后选择查询

代码语言:javascript
复制
SELECT temp1.*, temp2.COMPUTED_INFO FROM temp1 TABLE1 LEFT JOIN temp2 TABLE2 ON temp2.ID = temp1.ID
票数 2
EN

Stack Overflow用户

发布于 2017-09-06 08:31:38

上一次,当我遇到这样的问题时,我用一张临时桌子解决了它。我创建了带有SCRIPT1和SCRIPT2结果的临时表。然后将索引添加到ID列中。

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

这种情况发生在postgresql服务器上,但问题的根源是相同的。通常,RDBMS无法从过程/函数中优化子查询/结果集,并且不能对其行使用索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46070170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档