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