Я использую PostigreSQL10. У меня есть универсальный запрос, в котором пользователь может выбрать нестандартную комбинацию стиля категории, события, области для поиска конструкций. Имейте в виду, что стиль категории, событие, область находятся в разных таблицах.
Я хочу избежать множественных IF
и JOIN
. Я также хочу, чтобы планировщик запросов не кэшировал неправильный план для неправильной комбинации параметров и последующей перекомпиляции запроса каждый раз. Поэтому я должен использовать динамический SQL.
Чтобы получить динамический SQL в PostgreSQL, я должен использовать PL/pgSQL. Но, согласно его документации
для создания динамических команд внутри ваших функций PL/pgSQL, то есть команд, которые будут использовать разные таблицы или разные типы данных при каждом их выполнении. Обычные попытки PL/pgSQL кэшировать планы для команд в таких сценариях не работают. Для решения такого рода проблем предусмотрен оператор EXECUTE. Также отсутствует кэширование плана для команд, выполняемых через EXECUTE. Вместо этого команда всегда планируется при каждом выполнении инструкции. Если возвращается несколько строк, только первая будет назначена переменной INTO — здесь
и
Команды SQL, которые появляются непосредственно в функции PL/pgSQL, должны ссылаться на одни и те же таблицы и столбцы при каждом выполнении; то есть вы не можете использовать параметр в качестве имени таблицы или столбца в команде SQL. Чтобы обойти это ограничение, вы можете создавать динамические команды с помощью инструкции PL/pgSQL EXECUTE — за счет выполнения нового анализа синтаксического анализа и построения нового плана выполнения при каждом выполнении — здесь
Итак, я предполагаю, что PL/pgSQL не подходит для моего случая, так как у меня несколько таблиц.
Мой вопрос: действительно ли PL/pgSQL не подходит для моего случая или я что-то упускаю? Подвопрос: если это не подходит, как мне синтаксис динамического sql для postgreSQL, я не могу найти никакого учебника.
Спасибо
EXECUTE
из-за постоянного планирования запросов. О, также вы увидите там мой динамический запрос и то, как легко я могу добавлять ЕСЛИ. 16.01.2018