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 ответов

20 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
9
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта