Выберите между использованием EXECUTE и переписыванием похожих запросов в postgres - PullRequest
1 голос
/ 23 июня 2011

У меня практически один и тот же запрос соединения, разница между моими (> двумя) запросами заключается в одной из таблиц, в которых производится соединение. По производительности лучше: 1) переписать запросы (в одной хранимой процедуре?) ИЛИ 2) передать таблицу, по которой выполняется соединение, в качестве параметра в хранимой процедуре (написанной в plpgsql BTW) и выполнить запрос, используя EXECUTE

Полагаю, что 2) более элегантно, но нет слов, что с помощью EXECUTE нельзя получить выгоду от оптимизации запросов

Кроме того, как насчет того, когда у меня есть различное количество условий. Как я могу убедиться, что запрос выполняется в оптимальное время? (Я так понимаю, переписывание запроса более 10 раз - это не тот путь: D)

Ответы [ 4 ]

1 голос
/ 24 июня 2011

Из-за повторного планирования выполненного запроса есть некоторые накладные расходы на использование execute.

Для достижения лучших результатов сопровождения и напишите функцию, которая записывает различные нужные вам функции,Пример:

Триггер PostgreSQL для динамического создания кодов для нескольких таблиц

1 голос
/ 23 июня 2011

Если вы хотите получить выгоду от оптимизации запросов, вам обязательно нужно переписать запросы.

В результате получается менее элегантный и более длинный код, который сложнее поддерживать, но иногда это цена, которую приходится платить за производительность.

0 голосов
/ 24 июня 2011

1) переписать запросы (в одной хранимой процедуре?)

Если у вас есть возможность кэшировать план запроса, сделайте это.Динамическое выполнение SQL означает, что бэкэнд должен каждый раз перепланировать запрос.Проверьте PREPARE для получения более подробной информации об этом.

2) передайте таблицу, в которой выполняется соединение, в качестве параметра в хранимой процедуре (записано в plpgsql BTW)и выполнить запрос, используя EXECUTE

Не обязательно! Pl / PgSQL автоматически делает PREPARE / EXECUTE для вас.Это один из основных приростов скорости, который может быть получен при использовании Pl / PGSQL.Риторика: как вы думаете, генерация плана, показанного в EXPLAIN, была дешевой или простой?Кэшируйте этот кусок работы, если это вообще возможно.

Кроме того, как насчет того, когда у меня различное количество условий.Как я могу убедиться, что запрос выполняется в оптимальное время?(Полагаю, переписывание запроса более 10 раз - это не то, что нужно: D)

Использование отдельных операторов PREPARE ed - это один из способов, и самый "голый" способоптимизации выполнения запросов.Вы можете делать такие экзотические вещи, как использование функции PL, возвращающей один набор, в которую вы передаете разные аргументы, и она условно выполняет другой SQL, но я бы не рекомендовал это.Для оптимальной производительности придерживайтесь PREPARE / EXECUTE и управляйте указанным оператором внутри вашего приложения.

0 голосов
/ 23 июня 2011

EXECUTE является динамическим и требует как минимум нового анализа - так что больше накладных расходов.

...