我想根据它的名称选择一个实体,并根据字母顺序选择下一行的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+
你可以尝试没有窗口函数和一个相关的标量子查询,但我不确定这是否真的更快:
SELECT e1.name,
(select coalesce(max(name), '')
from entity e2
where e2.name > e1.name) as next
FROM entity e1
WHERE e1.name = 'CACTUS';