Найти - Пользователи
Полная версия: функциональный индекс PostgreSQL и сортировка
Начало » Базы данных » функциональный индекс PostgreSQL и сортировка
1
mgi4ka
Добрый день! Подскажите пожалуйста по задаче

Бд PostgreSQL. Есть таблица с задачами.
Поля:
-title, varchar 255
-status, char(4) статус задачи (новая, в процессе, на паузе, выполненная)
-read, datetime, время, когда задача была просмотрена пользователем, по умолчанию null

Нужно вывести задачи с определенной сортировкой. Сначала должны быть непрочитанные задачи, затем задачи отсортированные по статусу (те что в процессе и на паузе должны следовать сразу за непрочитанными)

Мои запросы такие:

select t.*, bool_or(t.read is not null) as read_boolean from tasks as t group by t.id order by read_boolean, t.status

select t.*, (case when t.read is null than 1 else 0 end) as read_int from tasks as t order by read_int, t.status


При большом объеме данных работает медленно. Хочется немного оптимизировать.

Вопросы:
1. Можно ли тут использовать функциональный индекс bool_or(t.read is not null)?
2. Можно ли создать виртуальное поле и по нему делать сортировку что-бы не использовать group by?

Спасибо за ответ!





PooH
Можно сортировать просто по t.read, получите тот же результат потому, что все null при сортировке уйдут вперед.

В первом запросе зачем вообще нужна агрегатная функция и группировка? Вполне можно переписать как
select t.id, t.title, t.status, t.read is not null as read_boolean 
from tasks as t 
order by t.read, t.status
звездочку убрал, потому терпеть ее не могу
mgi4ka
В первом запросе зачем вообще нужна агрегатная функция и группировка? Потому что t.read datetime и после того как в списке закончатся таски с t.read == null, дальше будет работать сортировка по этому же полю, так как там разные значения времени а не по статусу
PooH
mgi4ka
Потому что t.read datetime и после того как в списке закончатся таски с t.read == null, дальше будет работать сортировка по этому же полю, так как там разные значения времени а не по статусу
Согласен, не сообразил. Может тогда
select t.id, t.title, t.status, t.read is null as bool_read
from tasks as t 
order by bool_read desc, t.status
все лучше агрегации и, по идеи, должен индекс по read задействовать. покажите план выполнения на ваших данных.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB