У меня есть сервер PostgreSQL 11 с 8 ядрами.Я выполняю серию ~ 50 + запросов в VBA с использованием ADODB, которые опускают наборы результатов в Excel.Запросы выполняются ~ 1 час.Я хотел бы выполнять эти запросы параллельно (через несколько соединений), а не последовательно.
Насколько я понимаю, каждый экземпляр соединения с PostgreSQL использует только 1 ядро максимум, поэтому 7 из моих 8 ядер не используются,Я хотел бы установить несколько подключений к PostgreSQL, чтобы я мог использовать все 8 ядер и ускорить обработку, выполняя каждое подключение, скажем, 6 запросов в каждом параллельно, вместо того, чтобы выполнять все ~ 50 в последовательном.
Я рассмотрел асинхронные функции для драйвера Postgres ODBC, и я не уверен, что это решает проблему.Я не верю, что это устанавливает несколько соединений.
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "DRIVER={PostgreSQL Unicode(x64)}" _
& ";Server=" & Range("Server").Value _
& ";Database=" & Range("Database").Value _
& ";UID=" & Range("Username").Value _
& ";PWD=" & Range("Password").Value _
& ";Port=" & Range("Port").Value _
& ";sslmode=require"
conn.CommandTimeout = 600
РЕДАКТИРОВАТЬ: я не верю, что мое узкое место это мой жесткий диск (я использую SSD).Я попытался запустить однопоточный pgbench и получил 300 tps.Запуск четырехпотокового pgbench получил 1200 т / с.Поэтому я думаю, что здесь определенно есть неиспользованная вычислительная мощность, которую я бы хотел использовать.
РЕДАКТИРОВАТЬ: @TimWilliams, я просмотрел этот пример, и это очень полезно, спасибо!У меня есть дополнительный вопрос.Этот пример просто обрабатывает запросы без возврата набора результатов.Если каждый из моих ~ 50 запросов возвращает результаты (как показано ниже), как работает асинхронный режим?
sQRY = "select * from " & Chr(34) & "sFunction" & Chr(34) & "()"
rs.CursorLocation = adUseClient
rs.Open sQRY, conn, adOpenStatic, adLockReadOnly
Sheets("sFunction").Range("A1").CopyFromRecordset rs
rs.Close