Производительность при работе с Postgres в Node.js

Подскажите кто знает, почему такая ОГРОМНАЯ разница при выполнении элементарного запроса SELECT id FROM books WHERE id=1между запросом выполненным в pgadmin или DBeaver (около 4 милисекунд: 3 msec время выполнения + 1 msec время пересылки) и точно таким же запросом из nodejs на самом быстром драйвере Postgres.js: 84 msec!!! (перед тестовым запросом делается предварительный запрос select 1 для установления соединения и "разогрева" при connection pool = 10)? Код тестового файла:

const postgres = require('postgres')
const { hrtime } = process

const sql = postgres({
  host: 'localhost', port: 5432, database: 'rnd',
  username: 'postgres', password: 'Qwe123',
  max: 10,
  connection: { application_name: '@test.pg' },
})

sql`select 1` // предварительный запрос для "разогрева"
  .then(start)
  .then(() => console.log('finished'))
  .catch(console.error)

async function start() {
  const start = hrtime.bigint()
  const [book] = await sql`select id from books where id=1`
  const elapsed = Number(hrtime.bigint() - start)
  console.log(book)
  console.log(stringify(elapsed))
  await sql.end({ timeout: 0 })
}

function stringify(time) {
  time = Number(time)
  if(Number.isNaN(time)) {
    throw new Error(`time is not a number`)
  }
  const nsec = time % 1000
  time = (time - nsec) / 1000
  const mcsec = time % 1000
  time = (time - mcsec) / 1000
  const msec = time
  return `${msec} msec ${String(mcsec).padStart(3, '0')} µsec ${String(nsec).padStart(3, '0')} nsec`
}

Ответы (1 шт):

Автор решения: Alexander

Все оказалось банально просто, но на выяснение ушло неприлично много времени :-( Дело в том, что пока не выделено максимальное количество соединений (параметр max при создании экземпляра; в моем примере он = 10), то каждый новый запрос будет приводить к созданию нового соединения до тех пор пока кол-во новых соединений не достигнет значения connection pool size. И только после этого для новых запросов будет браться уже открытое сокетное соединение из connection pool. Как только я сделал 10 предварительных запросов вместо одного, то все последующие запросы начали выполняться в рамках 2-3 милисекунд.

→ Ссылка