簡體   English   中英

從優化更新... Postgres 9.1

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM