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

Чудеса чудесатые ) я пока с таким не сталкивался, интересно ) но

все же, почему постгрес предпочитает индекс по id , а не по дате ?
если явно видно что селективность у последнего выше ?
или я что не так понимаю ?

17 ответов

9 просмотров

А covering index по starts_at include(id) не пробовали?

Сергей-Кравчук Автор вопроса
Alex Yu
А covering index по starts_at include(id) не проб...

нет, можно попробовать, но мне кажется что это несколько избыточно, попробую конечно но вопрос в том числе почему так ? почему используется индекс по первичному ключу, а не по дате ?

Сергей Кравчук
нет, можно попробовать, но мне кажется что это нес...

Потому, что по первичному ключу -- он считает, что starts_at по id распределно равномерно, при этом за те последние два месяца у вас небось процэнтов 5 этой таблицы накопилось, так что его оцэнка -- что каждое двадцатое значение будет большэ указанной даты. Потому чтобы найти id потребуется считать всего-то 20 значений по индэксу, делов-то. Он грубо ошыбается потому, что на самом деле starts_at примерно монотонно зависит от id, и ему приходится перелопачивать 95% индэкса чтобы наткнуться на первый.

Ilya Anfimov
Потому, что по первичному ключу -- он считает, что...

Да, число 5% взято с потолка, но там от того, 20%, 5% или треть-процэнта -- суть не меняется, только оцэнки будут 5 значений и 80% индэкс, 20 значений и 95% индэкса или 300 значений и 99.7% индэкса.

Сергей-Кравчук Автор вопроса
Ilya Anfimov
Потому, что по первичному ключу -- он считает, что...

как-то не очень понятно ) при большом периоде да, звучит логично, но не когда запрос за пару дней данные берет эт отого у меня и ступор, но стату ему подсунуть попробуем

Сергей Кравчук
как-то не очень понятно ) при большом периоде да, ...

Можэте подставить реальное вашэ количество данных за два дня, и за всего, и понять, сколько там в итоге работы (реально и по его мнению) в обоих планах.

Сергей-Кравчук Автор вопроса
Alex Yu
А covering index по starts_at include(id) не проб...

CREATE INDEX statistics_app_track_starts_at_test2 ON statistics.app_track (starts_at ) include(id) ; помогло уже похоже на решение, но чуется оверхед, попробую еще совет со статистикой

Сергей Кравчук
CREATE INDEX statistics_app_track_starts_at_test2 ...

Почти уверен, что сработает только для нескольких дней. Попробуйте explain с начала сентября показать.

Сергей-Кравчук Автор вопроса

с включающим индексом ? или что именно ?

Сергей Кравчук
с включающим индексом ? или что именно ?

Если covering index допустим - я всегда использую возможность пустить запрос не трогая саму таблицу А про странности - думаю у каждого есть что рассказать

Сергей Кравчук
с включающим индексом ? или что именно ?

Да, с ключающим индэксом. Ну, вы жэ видели его оцэнку с какой-то сентябрьской даты -- cost 40. Сколько строк должно быть в выборке по index-only scan, чтобы было меньшэ? 400? Очевидно, что тот запрос по включающему индэксу не запустится.

Сергей-Кравчук Автор вопроса
Ilya Anfimov
Да, с ключающим индэксом. Ну, вы жэ видели его оцэ...

проведу тесты со статистикой, вернусь к индексу , а то я его удалил ) сейчас работаю с полным дампом реальных данных, когда найду лучшее решение, буду переносить на прод

Сергей Кравчук
проведу тесты со статистикой, вернусь к индексу , ...

А можэте с индэксом показать explain (verbose, analyze) на starts_at>'2021-09-12 07:19:29'; ?

Сергей-Кравчук Автор вопроса
Ilya Anfimov
А можэте с индэксом показать explain (verbose, ana...

мм, нет смысла смотреть мне кажется добавляю сутки в диапазон, и включающей индекс перестает работать test=# explain SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>'2021-10-11 07:19:29'; QUERY PLAN --------------------------------------------------------------------------------------------------------- Result (cost=729.61..729.62 rows=1 width=4) InitPlan 1 (returns $0) -> Limit (cost=0.44..729.61 rows=1 width=4) -> Index Scan using app_track_pkey on app_track (cost=0.44..61576919.25 rows=84448 width=4) Index Cond: (id IS NOT NULL) Filter: (starts_at > '2021-10-11 07:19:29'::timestamp without time zone) (6 rows) test=# explain SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>'2021-10-12 07:19:29'; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------- Aggregate (cost=440.40..440.41 rows=1 width=4) -> Index Only Scan using statistics_app_track_starts_at_test2 on app_track (cost=0.56..409.42 rows=12392 width=4) Index Cond: (starts_at > '2021-10-12 07:19:29'::timestamp without time zone) (3 rows) хотя фокус с id-0 работает неплохо даже если брать последний месяц

Сергей Кравчук
мм, нет смысла смотреть мне кажется добавляю сутки...

Ну да, понятно, что он гораздо раньшэ перейдёт на ту жэ ошыбку. Я просил 2021-09-12 просто как место, где всё ужэ очевидно будет по-старому.

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
5
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта