mgi4ka
Сен. 4, 2015 15:08:47
Добрый день! Подскажите пожалуйста по задаче
Бд 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
Сен. 4, 2015 19:24:55
Можно сортировать просто по 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
Сен. 4, 2015 19:35:28
В первом запросе зачем вообще нужна агрегатная функция и группировка? Потому что t.read datetime и после того как в списке закончатся таски с t.read == null, дальше будет работать сортировка по этому же полю, так как там разные значения времени а не по статусу
PooH
Сен. 4, 2015 20:14:08
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 задействовать. покажите план выполнения на ваших данных.