172 похожих чатов

Подскажите пожалуйста. Есть запрос по основной таблице task (~2.5 млн

записей) следующего вида:
explain (ANALYZE, BUFFERS) SELECT ......

FROM .... Набор джойнов по справочникам...

WHERE ... Фильтры по справочникам...

ORDER BY shema.task.deadline_time, shema.task.created_at

LIMIT 30

Проблема в том, что запрос отрабатывает 3 секунды и очень дорого стоит.
Специально для запроса создан двойной индекс по полям, которым идёт сортировка

CREATE INDEX deadline_time_created_at_idx ON shema.task USING btree (deadline_time, created_at)

Но планировщик строит запрос какими-то окольными путями. При этом если добавить к сортировке дески:
ORDER BY
shema.task.deadline_time DESC, shema.task.created_at DESC
То запрос начинает отрабатывать как надо за 2-3 миллисекунды пробегая по индексу (!причём в обратном порядке! Тк по умолчанию индекс создан asc) ~ 400 строк и набирая по условиям первые встретившиеся необходимые 30 полей.
А если DESC из ордер бай убрать, то индекс задействуется в каком-то там фулл скане и работа идёт со всей таблой попавшей под условия и там вообще страх и ужас я даже не вникал глубоко. Хотя по идее тут даже не обратное а прямое сканирование первых удовлетворяющих условиям строк должно быть. Есть идеи, почему такой парадокс?

9 ответов

7 просмотров

Скорее всего у вас where по этим же ролям, и оно сочетается с desc, но не с asc

Zakhary- Автор вопроса

По полям, которым сортируется запрос, нету ни условий ни джойнов. Нигде кроме сортировки они не всплывают. Ну только в самой выборке экземпляра уже

Zakhary
По полям, которым сортируется запрос, нету ни усло...

Попробуйте для таблиц увеличить объём собираемой статистики

Попробуйте выборку увеличить временно, сделать аналайз и посмотреть план

Zakhary- Автор вопроса
Konstantin Zaitsev
Попробуйте выборку увеличить временно, сделать ана...

Спасибо, завтра попробую. Но вообще по идее если он совсем наглухо не выключен, то не должно быть такого. Проблемный запрос существует уже давно, явно были аналайзы за это время. А структура наполнения таблицы принципиально не менялась

Zakhary
Спасибо, завтра попробую. Но вообще по идее если о...

Да понятно, и на order by не должно конечно влиять, просто для больших таблиц значение целевых строк статистики достаточно маленькое

Zakhary- Автор вопроса

Докидываю фактуру. Запросы, планы и версия в txt Полную выгрузку по всем таблицам прислать к сожалению не могу. Сделал выгрузку по столбцам сортировки в файлике -d @tzirechnoy

Zakhary- Автор вопроса

Честно говоря уже раз 7 перечитал, но не пойму. Объясните пожалуйста. - сортировка по индексу ведь необходима? В случае деск он не читает всю таблицу, потому что уверен что индекс отсортирован, и начиная с его конца, он берёт самые крайние значения Дедлайн+креатед? -почему моё понимание сортировки обратно реальному?

Zakhary
Честно говоря уже раз 7 перечитал, но не пойму. Об...

А про понимание сортировки индэкса — потому, что в индэксе на дату, отсортированном по asc, в начале будут самые ранние значения, а не самые последние. Но тут это вообще неважно — хоть так хоть так, скорость заметно не изменится.

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Заметил в ghci 9.4.8: > :t (<*>) @((->)_) (<*>) @((->)_) :: (w -> (a -> b)) -> (w -> a) -> w -> b Разве не должно (w -> (a -> b)) быть записано как (w -> a -> b)? Это баг, ил...
Михаил
13
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Или ты челендж хочешь?
Ilya Shvechikov
7
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Карта сайта