Мне нужно реализовать функциональность, которая соответствует функциональности GEQO в PostgreSQL. Я понимаю, что подход GEQO заключается в кодировании планов запросов в виде целочисленных строк, и GEQO генерирует эти возможные последовательности соединения случайным образом. Источник: http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html
Мой вопрос: как изменить функцию GEQO, если я точно знаю правильную последовательность соединений, чтобы мне не приходилось искать разные последовательности соединений. Например, если бы я знал, что лучший способ соединения 4 отношений - это 4-1-3-2, мне не нужно проверять другие перестановки.
Нет хороших материалов о том, как GEQO реализован в PostgreSQL. PostgreSQL только дает общее представление о функциональности GEQO, но мало что объясняет.
Или я мог бы достичь этой функциональности в самой standard_join_search () без использования GEQO?
источник
Ответы:
Один из способов сделать это без необходимости возиться с GEKO - использовать CTE.
CTE - это барьеры оптимизации, поэтому вы можете обернуть объединения внутри CTE в нужном вам порядке, и PG будет вынужден это сделать.
Например, если мы хотим заставить БД сначала присоединиться к t1 с t2 и только потом с t4, мы могли бы выполнить что-то вроде:
Это приведет к:
Это всего лишь пример, вы можете изменить его по мере необходимости - в любом случае PG не может изменить порядок между различными CTE.
Надеюсь, это поможет :)
источник