优化postgresql中的Lead查询

问题描述 投票:2回答:1

我想根据它的名称选择一个实体,并根据字母顺序选择下一行的namename列是varchar,是唯一的并且具有索引。

使用Lead窗口函数,这就是我提出的:

SELECT *
FROM (
    SELECT  
        *,
        LEAD("name", 1, '') OVER(ORDER BY name) AS next
    FROM entity    
    ORDER BY "name"
) results
WHERE "name" = 'CACTUS';

但是,随着实体表的大小增加,查询性能会下降。

查询计划如下所示:

Subquery Scan on results  (cost=0.42..31205.95 rows=1 width=299)
  Filter: ((results.""name"")::text = 'CACTUS'::text)"
  ->  WindowAgg  (cost=0.42..29002.24 rows=176297 width=299)"
        ->  Index Scan using ""IDX_2fbbd02c0f1ee2a4dda593705d"" on entity  (cost=0.42..26357.79 rows=176297 width=235)"

有更有效的方法吗?

postgresql版本11+

postgresql query-performance window-functions
1个回答
3
投票

你可以尝试没有窗口函数和一个相关的标量子查询,但我不确定这是否真的更快:

SELECT e1.name, 
       (select coalesce(max(name), '')
        from entity e2
        where e2.name > e1.name) as next
FROM entity e1
WHERE e1.name = 'CACTUS';
© www.soinside.com 2019 - 2024. All rights reserved.