Форум сайта python.su
Добрый день! Подскажите пожалуйста по задаче
Бд 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?
Спасибо за ответ!
Отредактировано mgi4ka (Сен. 4, 2015 15:50:38)
Офлайн
Можно сортировать просто по 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
Отредактировано PooH (Сен. 4, 2015 19:26:58)
Офлайн
В первом запросе зачем вообще нужна агрегатная функция и группировка? Потому что t.read datetime и после того как в списке закончатся таски с t.read == null, дальше будет работать сортировка по этому же полю, так как там разные значения времени а не по статусу
Офлайн
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
Офлайн