Postgres выполняет кэширование операторов на сервере? - PullRequest
1 голос
/ 04 августа 2011

У меня есть сервер Rails / ActiveRecord, использующий Postgres через собственный гем.Мне было интересно, если / как Postgres повторно использует планы запросов.Например, предположим, что в моем приложении есть такие вещи:

ActiveRecord::Base.execute("select foo from t where id=5")
ActiveRecord::Base.execute("select foo from t where id=7")

Узнает ли Posgres, что 2-й SQL практически идентичен 1-му, и повторно использовать существующие планы запросов?ищу ответ "просто используйте модели!"или что нет;Мне просто интересно, что происходит в базе данных.

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Я думаю, что postgresql не кэширует такие планы.Оптимальные планы могут быть разными, когда разные константы передаются запросам.Так что лучше создать новый план, чем использовать неоптимальный.Если вам нужен такой кеш, вы можете использовать подготовленные операторы или функции pl / pgsql.

1 голос
/ 04 августа 2011

Нет, кэширование не выполняется, если вы явно не указали серверу создать подготовленный объект оператора с помощью PREPARE (или метода, специфичного для драйвера). Вы должны использовать подготовленные операторы, поскольку они могут обеспечить вашему приложению защиту от внедрения SQL из коробки.

Оператор You слишком прост, т. Е. Время выполнения, вероятно, намного больше, чем при генерации плана запроса. Для того, чтобы получить преимущество (подготовленных заявлений), вам нужно - выполнить его несколько раз во время сеанса - запрос сложный (объединения, триггеры, функции, правила, ...)

1 голос
/ 04 августа 2011

Я не уверен, если это правильно, по моему личному мнению, если использовать переменную связывания в вашем приложении, то PostgreSQL Server будет повторно использовать существующий план запроса без анализа, переписать план еще раз。

Другой способ заключается в использовании оператора PREPARE в вашем приложении. Когда выполняется оператор PREPARE, указанный оператор анализируется, переписывается и планируется.Когда впоследствии выполняется команда EXECUTE, подготовленный оператор должен выполняться только. Таким образом, этапы синтаксического анализа, перезаписи и планирования выполняются только один раз, а не каждый раз, когда выполняется оператор

Дополнительная информация о «PREPARED»statemnet "пожалуйста, вист http://www.postgresql.org/docs/9.0/static/sql-prepare.html

0 голосов
/ 04 августа 2011

Postgres НЕ кеширует планы запросов.

Именованные подготовленные операторы - это совсем другое: если вы замечаете, что запрос часто выдается, вы можете использовать «Подготовить», а затем выполнить его несколько раз. ActiveRecord может сделать это, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...