решения n+1, кучу inner джоинов или cte или несколько запросов?
Мне видится, что "кучу" join'ов. Всё-таки они именно для того и сделаны (в частности).
Для каких то простых запросов это понятно. Но меня скорее случай когда есть много уровней вложенных запросов формата many to many
необходимо учесть, что планировщик эффективно строит план для относительно небольшого количества таблиц при джоинах и увеличение количества таблиц приведет к увеличению этапа разбора запроса и построения плана. Гляньте параметры join_collapse_limit и from_collapse_limit. У меня был случай, когда в запросе использовались представления, вложенные друг в друга, и запрос ужасно тормозил, деградируя до full scan. Увеличение join_collapse_limit и from_collapse_limit с базовых 8 до 20 решило проблему и план задействовал индексное сканирование. Учтите, что увеличение параметров приведет к нагрузке на ЦПУ
Ну так поднять их до значения, большего максимального количества JOIN в используемых запросах, да и всё. Defaults всё равно очень консервативные.
Да но это может привести к обратному эффекту, когда план строится неприемлемо долго.
Честно говоря, не сталкивался с такими случаями, чтобы план строился дольше 1 секунды, обычно десятки мсек или сотни на oltp системах. Возможно, в olap так?
сделайте несколько таблиц с несколькими сотнями партиций в каждой, и поджойтине их...
Извините, а в каком таком кейсе в oltp нужны данные из сотен партиций одновременно? Если мы говорим о реальном кейсе
планировщик не всегда способен отбросить большинство партиций на этапе планирования :/
Больше смахивает на ошибку при проектировании :)
да достатточно просто несколько вложенных select c join
при джойнах нескольких партиционированных таблиц, особенно если иногда партиционированные с непартиционированными джойнить, планировщик часто не может "прокинуть" даже явные ограничения на ключ партиционирования через несколько таблиц. Т.е. T1 join T2 where T1.id between 100 and 500 — в чуть более сложных случаях не сообразит какие именно партиции из T2 нужны.
что можно обойти указав явно диапазон для секционированной t2.
можно. Но это надо не забывать делать для каждого такого запроса и для каждой входящей в него партиционированной таблицы.
Обсуждают сегодня