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

Народ, почему не правильно считается предполагаемое количество строк? В плане Index

Scan using purchase_status_change_idx on purchase (cost=0.44..13816.52 rows=36 width=44) (actual time=0.075..420.762 rows=51539 loops=1)

смотрю статистику по этому полю
reltuples | 9.05529e+06

select array_length(histogram_bounds,1) from pg_stats where tablename = 'purchase' and attname = 'change_status_date';
array_length
--------------
101

соответственно
select 9.05529e+06 / 101;
?column?
--------------------
89656.336633663366

и это значение похоже на правду.

Но почему планировщик считает rows=36 ?

21 ответов

11 просмотров

А почему /100 ? Это только 100 самых частых значений. Вашэ значение индэкса в них, видимо, непопадает. Про остальных -- я дажэ не знаю, откуда он берёт оцэнку количества, но в общем, если допустимтам всего различных значений около 500 000 -- то логично предположыть, что большынство непопавшых в статистику будет выдавать порядка 2E7/5E5 ~ 40 строк.

А что реально среди этих 500 000 значений есть те, которые чуть-чуть непопали в статистику (то есть которых десятки тысяч) и те, которых считанные штуки или вообще одно -- ну, так это средняя температура по больницэ.

Guzya- Автор вопроса
Ilya Anfimov
А почему /100 ? Это только 100 самых частых значе...

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

Ну, смотрит-то он на elem_count_чототам.

Guzya- Автор вопроса
Guzya
101 это количество чанков в гистограмме, по идеи в...

Вообще, эта histogram -- это только bounds. То есть от такого-то до такое-то значение будет да, сколько-то десятков тысяч (там ещё выкидываются most_common, так что не очень понятно, сколько. Но десятки тысяч, скорее всего). А для любого одного конкретного внутри этого -- в среднем гораздо меньшэ. Насколько... Зависит от их количества там, между bounds.

Guzya- Автор вопроса
Ilya Anfimov
Вообще, эта histogram -- это только bounds. То ес...

так у меня условие change_status_date >= now() - '3 day' ::interval и планировщик должен посмотреть какое кол. чанков попадает под условие и их сумма будет предполагаемым значением. Но как он умудряется 36 строк определить я не понимаю.

Guzya
так у меня условие change_status_date >= now() - '...

И что там конкретно в histogram_bounds соответствует этому условию?

Guzya
так у меня условие change_status_date >= now() - '...

Вообще, глупо было начинать обсуждение плана запроса без 303899.

Guzya- Автор вопроса
Guzya
один чанк

Что конкретно в histogram_bounds соответствует этому условию?

Guzya- Автор вопроса
Ilya Anfimov
Что конкретно в histogram_bounds соответствует это...

select right(histogram_bounds::text,60) from pg_stats where tablename = 'purchase' and attname = 'change_status_date'; right -------------------------------------------------------------- ","2023-05-12 03:21:27.422117","2023-05-17 07:15:44.718477"} соответственно "2023-05-17 07:15:44.718477" он же последний на текущий момент

Guzya
select right(histogram_bounds::text,60) from pg_st...

Крайние значения в гистограмме, похоже, не учитываются, т.к. generic_restriction_selectivity() передает n_skip = 1 в histogram_selectivity() https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/selfuncs.c#L866

Guzya
select right(histogram_bounds::text,60) from pg_st...

Да, он, похожэ, считает это значение за максимум. Почему у меня тожэ выкинуто несколько малозначимых крайних значений -- я пока что непонимаю (Никита пытается объяснить). Но -- скорее всего, статистика последний раз собиралась, когда ничего после 12-го числа не было, потому он и считает, что за эти три дня (16-19, да?) (или 14-17?) -- у него ничего или почти ничего нет.

Guzya- Автор вопроса
Ilya Anfimov
Да, он, похожэ, считает это значение за максимум. ...

я ее вчера руками запускал, и сейчас запустил

Guzya
я ее вчера руками запускал, и сейчас запустил

А, да, у тебя вроде действительно там 17-м оканчивается, что-то я не туда посмотрел.

Ilya Anfimov
Выглядит как какая-то ошыбка.

Мне кажется, что последний диапазон гистограммы оказывается неполным, т.к. граница поискового диапазона попадает в его середину, поэтому он и не учитывается.

Nikita Glukhov
Мне кажется, что последний диапазон гистограммы ок...

Что само по себе (насчёт середины) выглядит странным, вроде границы должны быть границами. И, в любом случае -- ну, поделили бы на 2 estimate... А вот так, выкидывать оба экстремума из оцэнок и брать им значения просто с потолка...

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

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

подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Добрый день. Абракадабра в 12-й студии ввела новый тип поля БД TSQLTimeStampOffset, использую в постгресе timestampz и вот с 12-й версии начались чудеса! До этого поля times...
Delphi Photo
9
Коллеги, здравствуйте! А можно узнать ваше мнение относительно Wolfram Mathematica vs Julia? Просто у меня стоит выбор между тем, чтобы продолжить преподавать Wolfram Mathemat...
Илья Гаража
10
Обновленный chat тестили уже господа? Готовимся на заводы ? Простой проект на ларавель собирает за 1 ответ..
Jacov Borisov
14
А если без шуток, на чем десктоп сейчас пишут кроссплатформенный (ну чтобы с минимальным допиливанием под каждую платформу) и чтобы хорошая производительность софта была. Толь...
🐈
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
На одной бирже предложили обновить modx evo 1.0.1 Как думаете, стоит браться?
Artem
9
Карта сайта