[英]Update … from optimization. Postgres 9.1
我有兩張大桌子:
tbl_a
id(int), cnt(int default:0)
tbl_b
id(int), a_id(int)
我需要在tbl_b中計算所有具有相同a_id的行,並將該值放入tbl_a。
在這里我找到了方法:
update tbl_a
set cnt = tb.c
from (select count(*) c,a_id from tbl_b group by a_id) tb
where tb.a_id = tbl_a.id
但該查詢適用於每1000行大約8秒 。 這是不可接受的,因為我有大約6M的。
試圖創建臨時表
... AS (select count(*),a_id from tbl_b group by a_id)
甚至添加了b-tree索引,但沒有任何變化。
可以在同一硬件上執行得更快嗎?
UPD1:
"Update on tbl_a (cost=0.00..343357.80 rows=40000 width=459)"
" -> Nested Loop (cost=0.00..343357.80 rows=40000 width=459)"
" -> Seq Scan on tbl_b_temp (cost=0.00..617.00 rows=40000 width=18)"
" -> Index Scan using tbl_a_pkey on tbl_a (cost=0.00..8.55 rows=1 width=445)"
" Index Cond: (id = tbl_b_temp.a_id)"
rows = 40000因為我創建了較小的臨時表。
查詢:
create temporary table tbl_b_temp as
select count(*) as c, a_id from tbl_b group by a_id order by a_id limit 40000;
CREATE INDEX a_id_ind on tbl_b using btree (a_id);
使用(大)臨時表時,請確保在創建或更改后運行ANALYZE
,因為autovacuum不包括臨時表。 這可能會改進Postgres提出的查詢計划。
autovacuum無法訪問臨時表。 因此,應通過會話SQL命令執行適當的真空和分析操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.