PostgreSQL更新语句性能

wr98u20j  于 2022-10-15  发布在  PostgreSQL
关注(0)|答案(2)|浏览(266)

我有一个表,其中包含以下各列:

id (int) 
col1 (int) 
col2 (varchar) 
date1 (date) 
col3 (int) 
cumulative_col3 (int)

约75万行。
我想用相同的col1, col2和之前的date1col3的总和来更新cumulative_col3
我有关于(date1)(date1, col1, col2)(col1, col2)的索引。
我尝试了以下查询,但需要很长时间才能完成。

update table_name
set cumulative_col3 = (select sum(s.col3)
                       from table_name s
                       where s.date1 <= table_name.date1
                         and s.col1 = table_name.col1
                         and s.col2 = table_name.col2);

我可以做些什么来提高此查询的性能?

z9ju0rcb

z9ju0rcb1#

您可以尝试将以下索引添加到表中:

CREATE INDEX idx ON table_name (date1, col1, col2, col3);

如果使用此索引,应该可以更快地计算相关的SUM子查询。

ycl3bljg

ycl3bljg2#

您可以尝试在派生表中计算运行总和:

update table_name
  set cumulative_col3 = t.cum_sum
from (
  select id,
         sum(s.col3) over (partition by col1, col2 order by date1) as cum_sum
  from table_name
) s  
where s.id = table_name.id;

这里假设id是表的主键。

相关问题