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