【发布时间】:2017-05-10 14:45:30
【问题描述】:
我的上下文是PostgreSQL 8.3
我需要加快这个查询,因为两个表都有数百万条记录。
对于表 Calls 中的每一行,Trunks 表中有两行。对于每个 call_id,当trunk_id 是两行中最低的trunk_id 时,我想将值从trunks.trunk 复制到calls.orig_trunk。 ...当trunk_id 是两行中最高的trunk_id 时,将值从trunks.trunk 复制到calls.orig_trunk。
表调用的初始内容:
Call_ID | dialed_number | orig_trunk | dest_trunk
--------|---------------|------------|-----------
1 | 5145551212 | null | null
2 | 8883331212 | null | null
3 | 4164541212 | null | null
表干:
Call_ID | trunk_id | trunk
--------|----------|-------
1 | 1 | 116
1 | 2 | 9
2 | 3 | 168
2 | 4 | 3
3 | 5 | 124
3 | 6 | 9
表格调用的最终内容:
Call_ID | dialed_number | orig_trunk| dest_trunk
--------|---------------|-----------|----------
1 | 5145551212 | 116 | 9
2 | 8883331212 | 168 | 3
3 | 4164541212 | 124 | 9
我为每一列都创建了索引。
update calls set orig_trunk = t2.trunk
from ( select call_id,trunk_id from trunks
order by trunk_id ASC ) as t2
where (calls.call_id=t2.call_id );
update calls set dest_trunk = t2.trunk
from ( select call_id,trunk_id from trunks
order by trunk_id DESC ) as t2
where (calls.call_id=t2.call_id );
有什么想法吗?
【问题讨论】:
-
如果您向我们提供带有数据样本的 sql fiddle。它使人们更容易尝试一些东西并将其与执行进行比较。如果您还没有这样做,那么加快进程的一种方法是向 id 列添加索引。
标签: sql postgresql multiple-records