为大型 Postgresql 表优化嵌套连接窗口函数
Posted
技术标签:
【中文标题】为大型 Postgresql 表优化嵌套连接窗口函数【英文标题】:Optimizing a nested join window function for a large Postgresql table 【发布时间】:2012-07-11 18:09:27 【问题描述】:我一直在对一个大小为 56GB(789700760 行)的表运行以下查询,并且遇到了执行时间的瓶颈。从之前的一些示例中,我认为可能有一种方法可以“取消嵌套”INNER JOIN,以便查询对大型数据集执行得更好。特别是下面的查询在 MPP PostgreSQL 部署上完成执行需要 7.651 小时。
create table large_table as
select column1, column2, column3, column4, column5, column6
from
(
select
a.column1, a.column2, a.start_time,
rank() OVER(
PARTITION BY a.column2, a.column1 order by a.start_time DESC
) as rank,
last_value( a.column3) OVER (
PARTITION BY a.column2, a.column1 order by a.start_time ASC
RANGE BETWEEN unbounded preceding and unbounded following
) as column3,
a.column4, a.column5, a.column6
from
(table2 s
INNER JOIN table3 t
ON s.column2=t.column2 and s.event_time > t.start_time
) a
) b
where rank =1;
问题一:有没有办法修改上面的sql代码来加快查询的整体执行时间?
【问题讨论】:
如果排名每 column2, column1 组合仅返回一行,则 last_value() 似乎是多余的。你期待多行吗?否则,第 3 列中 rank = 1 的值应与计算值相同。 【参考方案1】:您可以将 last_value 移动到外部子查询,这可能会为您带来一些性能改进。 last_value 正在获取每个分区的 column3 的值,其中每个分区的开始时间最小 - 正是 rank = 1:
select column1, column2,
ast_value( a.column3) OVER (PARTITION BY column2, column1 order by start_time ASC
RANGE BETWEEN unbounded preceding and unbounded following
) as column3,
column4, column5, column6
from (select a.column1, a.column2, a.start_time,
rank() OVER (PARTITION BY a.column2, a.column1 order by a.start_time DESC
) as rank,
a.column3, a.column4, a.column5, a.column6
from (table2 s INNER JOIN
table3 t
ON s.column2 = t.column2 and s.event_time > t.start_time
) a
) b
where rank = 1
否则,你需要提供更多关于执行计划和table2和table3的信息以获得更多帮助。
【讨论】:
感谢您的帮助我正在测试更新查询的时间,但是当我使用 last_value(a.column3) 时遇到了一个小问题,给出的错误是 ERROR: missing FROM-clause entry for表“一”。我用 last_value(column3) 替换了命令这仍然有效吗?以上是关于为大型 Postgresql 表优化嵌套连接窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
将嵌套的 JSON 从 PostgreSQL 的多对多连接表返回到 node.js