Самые быстрые запросы в Postgres с клиентом Node.js и пулами соединений - сохраненные функции или подготовленные операторы? - PullRequest
0 голосов
/ 21 ноября 2018

У нас есть база данных Postgres на AWS, с таблицей, которая будет содержать миллионы (но не десятки миллионов) строк.Первичный ключ - это один столбец.Доступ к данным будет в основном равномерно распределен между строками данных, и это будут простые операторы SELECT по первичному ключу, поэтому в основном мы получаем либо одну строку, либо ни одного в качестве набора данных результата.

Наш клиентнаписано в Node.js с использованием модуля node-postgres.Мы используем пул соединений.Мы хотели бы сделать все от нас зависящее, чтобы выполнить наши SELECT как можно быстрее;будут ли подготовленные операторы или хранимые функции хорошей идеей в этом сценарии?Что будет на бумаге быстрее?

Редактировать: в настоящее время мы обрабатываем пул соединений с помощью модуля pg-pool, который поставляется вместе с самим node-psotgres, и выбираем новое соединение из пула при каждом запросе.Я не уверен, что работа, выполненная сервером при подготовке оператора или хранимой функции, теряется при передаче соединения обратно в пул.

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете оптимизировать производительность запросов PostgreSQL на Node.js несколькими способами с помощью модуля node-postgres, но, с учетом описанных вами случаев использования, я чувствую, что ни один из них не принесет существенного выигрыша в производительности.Общее tl; dr: относится к эталону, эталону, эталону.

Подготовленные операторы

Использование подготовленных операторов и пула соединений не являются взаимоисключающими, но планы запросовподготовленные операторы кэшируются только для каждого соединения.Пока эти соединения остаются активными (пока сам пул не закрыт), кэшированные планы запросов остаются неизменными и связываются с соединением, которое их выполнило.В худшем случае несколько соединений выполняют этап планирования для данного подготовленного запроса один раз.

Подготовленные операторы могут дать некоторые преимущества в производительности, поскольку node-postgres не пропускает планирование запросаэтап для них после первого выполнения ( исходный код, JavaScript , исходный код, собственные привязки ).

Собственные привязки

Говоря о собственных привязках, автор модуля node-postgres также поддерживает совместимый с Node.js набор привязок к встроенной библиотеке C libpq в упаковке node-pg-native.Если ваша среда развертывания поддерживает совместимый компилятор, их, возможно, стоит изучить.

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

...