我有一个具有8个内核的PostgreSQL 11服务器。我正在使用ADODB在VBA中运行一系列大约50多个查询,这些查询将结果集下拉到Excel中。查询大约需要1个小时才能运行。我想并行(通过多个连接)而不是串行地运行这些查询。
我的理解是,到PostgreSQL的每个连接实例最多仅使用1个核心,因此未使用我的8个核心中的7个。我想建立到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 tps。因此,我认为这里肯定有尚未开发的处理能力可供您利用。
编辑:@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