Это сложный вопрос, но вот несколько ответов.
Как пишет @ laurenz-albe, вы можете использовать pgbouncer и подготовленные операторы, но нужно использовать пул сеансов. Это позволяет вам использовать подготовленные операторы в течение всего времени вашего соединения (т. Е. Пока ваш экземпляр NpgsqlConnection открыт). Однако, если вы находитесь в кратковременном сценарии подключения (например, веб-приложение, которое открывает и закрывает подключение для каждого HTTP-запроса), вам не повезло. В этом смысле можно сказать, что объединенные и подготовленные операторы несовместимы.
Однако, если вы используете внутренний механизм пула Npgsql (по умолчанию включен) вместо pgbouncer, то ваши подготовленные операторы автоматически сохраняются при открытии / закрытии соединения. Другими словами, когда вы вызываете NpgsqlCommand.Prepare()
, если физическое соединение уже подготовило SQL, то подготовленный оператор используется повторно. Это сделано специально для того, чтобы разблокировать преимущества скорости подготовленных операторов для сценариев кратковременного подключения. Это довольно уникальное поведение Npgsql, см. Документацию для получения дополнительной информации .
Это одно из преимуществ пула внутрипроцессных соединений по сравнению с пулом вне процесса, таким как pgbouncer - Npgsql сохраняет информацию о физическом соединении при его передаче, в данном случае это таблица какие операторы подготовлены (имя и SQL).