Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2015 15:08:47

mgi4ka
Зарегистрирован: 2015-09-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

функциональный индекс PostgreSQL и сортировка

Добрый день! Подскажите пожалуйста по задаче

Бд 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)

Офлайн

#2 Сен. 4, 2015 19:24:55

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

функциональный индекс PostgreSQL и сортировка

Можно сортировать просто по 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)

Офлайн

#3 Сен. 4, 2015 19:35:28

mgi4ka
Зарегистрирован: 2015-09-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

функциональный индекс PostgreSQL и сортировка

В первом запросе зачем вообще нужна агрегатная функция и группировка? Потому что t.read datetime и после того как в списке закончатся таски с t.read == null, дальше будет работать сортировка по этому же полю, так как там разные значения времени а не по статусу

Офлайн

#4 Сен. 4, 2015 20:14:08

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

функциональный индекс PostgreSQL и сортировка

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 задействовать. покажите план выполнения на ваших данных.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version