在PostgreSQL中优化潜在顾客查询

时间:2019-03-05 15:02:36

标签: postgresql query-performance window-functions

我要根据实体的名称和字母顺序选择一个实体,然后选择下一行的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+版本

1 个答案:

答案 0 :(得分: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';