Size: a a a

pgsql – PostgreSQL

2020 May 25

СГ

Сергей Голод... in pgsql – PostgreSQL
планы выполнения естественно разные, так как используются разные индексы. меня "напрягает" именно то, что до пересоздания индексов всё работает как и ожидаешь. И только после пересоздания всё начинает "косячить".
источник

GS

Grigory Smolkin in pgsql – PostgreSQL
сейчас вернем
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
план запроса до пересоздания _byperiod:
https://explain.tensor.ru/archive/explain/898fe777dabcd3bec4e2ff246612c6f1:0:2020-05-25

план запроса после пересоздания _byperiod:
https://explain.tensor.ru/archive/explain/20aca0d4b6491cfa21f48c613d1daf29:0:2020-05-25
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
при выполнении запроса - строится правильный план, в который включаются индексы _bydims и _bydims449. Но как только я удаляю индекс _byperiod и заново его создаю (полностью идентичный) - то при построении плана начинает использовать именно этот индекс, который я создал последним. хотя в таблице по прежнему присутствуют два индекса, которые до пересоздания byperiod корректно использовались.

вопрос - правильное ли такое поведение ванильного постгреса?
Только если у планов (того и другого) [очень] близкие оценки, по идее. Ну или с prepared statements могут быть всякие неочевидные проблемы.

> (последний создаваемый индекс является приоритетным)

Но именно такого быть не должно.
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Только если у планов (того и другого) [очень] близкие оценки, по идее. Ну или с prepared statements могут быть всякие неочевидные проблемы.

> (последний создаваемый индекс является приоритетным)

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

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
правильно ли я понимаю что порядок создания индексов тоже имеет существенное значение, даже если выполнение  плана с этим последним созланным будет дольше(дороже) чем с использованием ранее созданных индексов?
Подождите, почему он вообще должен иметь значение?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
план запроса до пересоздания _byperiod:
https://explain.tensor.ru/archive/explain/898fe777dabcd3bec4e2ff246612c6f1:0:2020-05-25

план запроса после пересоздания _byperiod:
https://explain.tensor.ru/archive/explain/20aca0d4b6491cfa21f48c613d1daf29:0:2020-05-25
Ну и смотрите:

1. Nested Loop  (cost=33822.59..33825.37 rows=1 width=47) (actual time=13.577..15.041 rows=371 loops=1)
2. Nested Loop  (cost=33822.59..33825.37 rows=1 width=47) (actual time=20.039..1079.650 rows=371 loops=1)
Оценки вообще 1:1!
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
потому что именно после удаления и повторного создания этот индекс становится "последним созданным"
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
и именно после пересоздания индекса "ломается" план
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
потому что именно после удаления и повторного создания этот индекс становится "последним созданным"
Ещё раз, быть такого не должно. Если выполнение  плана с этим последним созданным будет дороже, выбираться должен какой-то другой план.
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
ничего другого с таблицей и СУБД не происходит, настройки не меняются, данные в таблицу не добавляются
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Ещё раз, быть такого не должно. Если выполнение  плана с этим последним созданным будет дороже, выбираться должен какой-то другой план.
значит и в ванильной версии есть ошибка(?), которая  вылазит именно при пересоздании индекса
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
и именно после пересоздания индекса "ломается" план
Да Вы на оценки посмотрите — они идентичны. А выбор того или иного из планов с равной стоимостью зависит от "погоды на Марсе"... и почему нет? ;)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
значит и в ванильной версии есть ошибка(?), которая  вылазит именно при пересоздании индекса
Да нет там никакой ошибки, скорее всего. Совпали оценки того и другого пути доступа — и что PostgreSQL должен с этим делать? ;)
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Да нет там никакой ошибки, скорее всего. Совпали оценки того и другого пути доступа — и что PostgreSQL должен с этим делать? ;)
если следовать этой логике то выполнение плана тоже должно тогда подчиняться "погоде на Марсе")), и каждый раз будет разный план, так?
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
но почему-то до пересоздания индеса ВСЕГДА выбирается план с использованием _bydims. А после пересоздания ВСЕГДА _byperiod
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Ну и смотрите:

1. Nested Loop  (cost=33822.59..33825.37 rows=1 width=47) (actual time=13.577..15.041 rows=371 loops=1)
2. Nested Loop  (cost=33822.59..33825.37 rows=1 width=47) (actual time=20.039..1079.650 rows=371 loops=1)
Оценки вообще 1:1!
это если сравнивать 14 и 20, а если по верхней границе то там 15 и 59 уже есть разница
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
если следовать этой логике то выполнение плана тоже должно тогда подчиняться "погоде на Марсе")), и каждый раз будет разный план, так?
Нет. Выбор плана детерминированный, но как именно — теоретически неважно. Если оценки идеальные. ;)

> но почему-то до пересоздания индеса ВСЕГДА выбирается план с использованием _bydims. А после пересоздания ВСЕГДА _byperiod

Вот именно поэтому, скорее всего. Кстати, вряд ли даже тот, кто написал эту часть планировщика, сходу скажет Вам, в каком порядке будет выбор в таких случаях (потому что, это, опять-таки, в идеале не имеет значения). ;)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Сергей Голод
это если сравнивать 14 и 20, а если по верхней границе то там 15 и 59 уже есть разница
Подождите, где Вы это видите? Я вижу, что оценки строго совпадают, как всего плана, так и самого "нижнего" узла:
1. Index Scan using _inforg4491_bydims4496 on _inforg4491 t6  (cost=0.56..2.79 rows=1 width=103) (actual time=0.002..0.003 rows=1 loops=371)
2. Index Scan using _inforg4491_byperiod on _inforg4491 t6  (cost=0.56..2.79 rows=1 width=103) (actual time=1.187..2.863 rows=1 loops=371)

А в остальном планы вообще идентичны (поэтому и стоимость одинаковая).
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Подождите, где Вы это видите? Я вижу, что оценки строго совпадают, как всего плана, так и самого "нижнего" узла:
1. Index Scan using _inforg4491_bydims4496 on _inforg4491 t6  (cost=0.56..2.79 rows=1 width=103) (actual time=0.002..0.003 rows=1 loops=371)
2. Index Scan using _inforg4491_byperiod on _inforg4491 t6  (cost=0.56..2.79 rows=1 width=103) (actual time=1.187..2.863 rows=1 loops=371)

А в остальном планы вообще идентичны (поэтому и стоимость одинаковая).
это я посмотрел не на кост, а на actual time. косты у всех одинаковы, да.
источник