@pgsql

Страница 892 из 1062
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
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

When performing ANALYZE, the number of rows to sample is determined as (300 * statistics_target)
спасибо! выходит самплов будет по факту 3 000 000 собираться и этого все равно не хватает

Tolya
18.07.2018
12:25:17
Да

выкрутил по полям bar, dar статистику и по полю индекса

Yaroslav
18.07.2018
12:26:16
спасибо! выходит самплов будет по факту 3 000 000 собираться и этого все равно не хватает
А сколько rows в таблице? И, тем не менее, посмотрите правдоподобности оценок по одной этой функции в планах. Т.е. "WHERE bad_func(dar) = '111111'";

Tolya
18.07.2018
12:26:18
после этого прогнал vacuum analyze

rows=178970288

данные распределены так, что под топ100 значений bar попадает около 80% всей таблицы, а на остальные десятки тысяч значений около 20%

соотв, все проблемы начинаются с запросом тогда, когда значение берется из топ100

Google
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
а из составного индекса значения не выдернутся
Нет, стоп. Мы говорим только об оценках, не об executor-е.

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

неправильно понял

Yaroslav
18.07.2018
12:34:44
все вариации запроса всегда идут с комбинацией bar + bad_func(dar)
Попробуйте хотя бы просто EXPLAIN (без ANALYZE). Т.е. сравнить "WHERE bar + bad_func(dar)" с "WHERE bad_func(dar)".

Именно оценки кол-ва 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
rows=14952 с тремя условиями, rows=894851 с одним (по оценке)
С одним — это именно с "WHERE bad_func(dar)"?

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
фактически нашел 2 строки, а оценка в 900к строк
Показали бы вы EXPLAIN-ы... отдельно для каждого из условий, и по трём вместе. С ANALYZE, конечно, интереснее (если это возможно).

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
0 строк фактически, примерно такой-же результат в 14-15к в оценке и быстрое время выполнения
Покажите план, с какой-нибудь "редкой" и "частой" костантами. Формы планов, время выполнения и т.п. сейчас вообще не имеют значения.

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
это планы по редким bar по частому выше немного кидал как-раз
Да это не то. :( Лучше по одному конкретному условию — так трудно что-то анализировать. Т.е. здесь перемножены какие-то селективности, а какие — кто его знает... Трудно угадать по данному X (=a*b) угадать a и b. ;)

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

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

Admin
ERROR: S client not available

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
это значения, соответсвующие частому и редкому bar (они взаимосвязаны)
Ага, стоп, вот это, похоже, косяк (оценки-то 1:1!). Попробуйте пару любых других.

и посчитать фактическое значение тоже будет сложнее, тк нет индекса отдельного
А что сложного? EXPLAIN ANALYZE, и некоторое время спустя... вы их знаете. :)

Yaroslav
18.07.2018
14:00:47
те же ожидаемые значения вернул
Что как бы намекает нам, что никакая это не статистика, а default estimate (0.5%). И это — проблема.

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
одинаковые выскоие rows для функции одинаковые низкие rows для поля без вызова функции
Да забудьте вы о всём остальном, кроме функции (не прыгайте, разберитесь с ней)!

и в случае вызова без функции по нему идет план - индекс скан
Ещё раз, формы плана сейчас неинтересны. Я вам уже писал про кидание монеты, нет? ;)

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

Страница 892 из 1062