
Tolya
18.07.2018
12:17:19
т.е. если я задаю значение сбора статистики 100, у меня размер массива становится 100. При увеличении значения растет размер массива, соотв.
что это значит при выполнении команды analyze? Количество анализируемых в таблице строк не уменьшитя? просто больше их сохранится в массивах?

Yaroslav
18.07.2018
12:17:22

Tolya
18.07.2018
12:18:16
количество анализируемых строк не зависит от параметра set statistics? от этого зависит только итоговое число сохраненных в массивах значений?

Google

Yaroslav
18.07.2018
12:19:25
/src/backend/statistics/README

Tolya
18.07.2018
12:22:27
SELECT foo
FROM table
WHERE bar = '1111111-1111-1111-1111-11111111111'
and baz = 'SOME__NONSELECTIVE_STATUS'
AND bad_func(dar) = '111111';
create index idx_bar_bad
ON table (bad_func(dar), bar) WHERE ((baz) = 'SOME__NONSELECTIVE_STATUS');
функция immutable

Yaroslav
18.07.2018
12:25:02

Tolya
18.07.2018
12:25:17
Да
выкрутил по полям bar, dar статистику и по полю индекса

Yaroslav
18.07.2018
12:26:16

Tolya
18.07.2018
12:26:18
после этого прогнал vacuum analyze
rows=178970288
данные распределены так, что под топ100 значений bar попадает около 80% всей таблицы, а на остальные десятки тысяч значений около 20%
соотв, все проблемы начинаются с запросом тогда, когда значение берется из топ100

Google

Tolya
18.07.2018
12:30:51

Yaroslav
18.07.2018
12:31:16

Tolya
18.07.2018
12:31:23
нет, есть только составной
все вариации запроса всегда идут с комбинацией bar + bad_func(dar)

Yaroslav
18.07.2018
12:32:09

Tolya
18.07.2018
12:32:30
вроде, это не важно в обратную сторону. Тогда пойдут битмапы
а из составного индекса значения не выдернутся

Yaroslav
18.07.2018
12:33:12

Tolya
18.07.2018
12:34:03
да, в таком случае не так важен отдельный индекс скорее всего
неправильно понял

Yaroslav
18.07.2018
12:34:44
Именно оценки кол-ва rows.
rows=178970288
Да, это sample size меньше 2%, не очень-то густо... Тем не менее, вероятность собрать более-менее нормальные гистограммы и MCV, как ни удивительно, довольно высока. ;)

Tolya
18.07.2018
12:39:18
rows=14952 с тремя условиями, rows=894851 с одним (по оценке)
в первом случае фактически возвращается 1 строка, а не 15к строк
во втором сейчас проверяю, но тоже скорее всего не 900к строк

Yaroslav
18.07.2018
12:43:31

Tolya
18.07.2018
12:52:57
да

Yaroslav
18.07.2018
12:55:45
да
В общем, проверьте оценки по этим условиям независимо.
А потом уже надо что-то думать...

Tolya
18.07.2018
13:05:52
да, все еще хуже, чем с первым
фактически нашел 2 строки, а оценка в 900к строк

Google

Yaroslav
18.07.2018
13:08:24

Tolya
18.07.2018
13:11:43
По всем трем

Yaroslav
18.07.2018
13:11:53
И для разных констант (с выской и низкой селективностью) — тоже бы не неплохо.

Tolya
18.07.2018
13:11:55
только по одному

Yaroslav
18.07.2018
13:13:00
А тип результата у bad_func() какой?

Tolya
18.07.2018
13:13:10
varchar(64)
у поля dar тоже
первый план шустро работает и выглядит адекватно, но засчет неточной статистики работает нестабильно
сейчас быстро, вчера медленно, завтра опять что-то изменится
разница во времени выполнения пол минуты и больше

Yaroslav
18.07.2018
13:15:29
у поля dar тоже
Подождите, что-то тут не то, мне кажется (как-то он совсем промахивается в оценке... не должно такого быть).

Tolya
18.07.2018
13:16:44
да, вполне вероятно что-то не так и у меня руки кривые ?
тоже кажется такой промах очень странным

Yaroslav
18.07.2018
13:18:44

Tolya
18.07.2018
13:19:45
0 строк фактически, примерно такой-же результат в 14-15к в оценке и быстрое время выполнения
Buffers: shared hit=3 read=2
по структуре план такой же

Yaroslav
18.07.2018
13:21:38

Tolya
18.07.2018
13:29:14
это планы по редким bar
по частому выше немного кидал как-раз

Google

Tolya
18.07.2018
13:30:32
Первый - частый (в плане много строк с таким bar), второй и третий редкие
в целом, по бизнесу запроса во всех случаях может вернуться или 1 или 0 строк

Yaroslav
18.07.2018
13:33:41

Tolya
18.07.2018
13:34:09
к сожалению, пока не могу воспроизвести долгое выполнение, хотя в логах вижу такие запросы присутствуют. предположение, что это приосходит из-за того, что они в какой-то момент начинают выполняться по другому плану

Yaroslav
18.07.2018
13:36:00
Пока не разберётесь (если это вообще возможно), вы просто наблюдаете за тем, как планировщик "подбрасывает монету" (и ему когда-то везёт), понимаете? ;)

Admin
ERROR: S client not available

Tolya
18.07.2018
13:40:07

Yaroslav
18.07.2018
13:40:43
Ясно, а насколько эти оценки близки к реальности (хотя бы примерно)?

Tolya
18.07.2018
13:41:06
сейчас вот жду завершения запросов
довольно точые оценки

Yaroslav
18.07.2018
13:43:02
Для частого он оценивает ~ 2%, так? И у вас распределение частых значений примерно такое и есть?

Tolya
18.07.2018
13:43:36
порядки совпадают, различия между фактическими значениями и предположением в первом небольшая совсем

Yaroslav
18.07.2018
13:46:08

Tolya
18.07.2018
13:49:35
это значения, соответсвующие частому и редкому bar (они взаимосвязаны)
по функции сложно сказать частые и редкие значения и их распределение отдельно от bar
и посчитать фактическое значение тоже будет сложнее, тк нет индекса отдельного

Andre
18.07.2018
13:50:33

Google

Yaroslav
18.07.2018
13:52:40

Tolya
18.07.2018
13:59:13
rows=894851

Yaroslav
18.07.2018
14:00:47

Tolya
18.07.2018
14:15:37
проверил без функции тоже наугад
там тоже везде значения совпадают
хотя rows=9 (тоже везде)
в плане только по dar полю без функции (которая по сути нормализует строки)

Yaroslav
18.07.2018
14:16:43
работаю над этим ))
Селективность как-то очень похожа на 0.5%.
Есть другие варианты констант? ;)

Tolya
18.07.2018
14:18:36
наугад подставил 20 значений из первых 4000
совпадает везде
одинаковые выскоие rows для функции
одинаковые низкие rows для поля без вызова функции
само по себе поле вроде относительно селективным должно быть
и в случае вызова без функции по нему идет план - индекс скан

Yaroslav
18.07.2018
14:19:55

Tolya
18.07.2018
14:21:34
да, если смотреть с любыми рандомными значениями (Пока что) – всегда константное число возвращаемых строк