Оптимизация запроса Lead в postgresql - PullRequest
2 голосов
/ 05 марта 2019

Я хотел бы выбрать сущность на основе ее имени и в алфавитном порядке, выберите 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 +

1 Ответ

3 голосов
/ 05 марта 2019

Вы можете попробовать без оконной функции и связанного скалярного подзапроса, но я не уверен, что это действительно быстрее:

SELECT e1.name, 
       (select coalesce(max(name), '')
        from entity e2
        where e2.name > e1.name) as next
FROM entity e1
WHERE e1.name = 'CACTUS';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...