PostgreSQL在Excel VBA中的多线程查询

时间:2019-01-25 15:08:59

标签: excel vba multithreading postgresql odbc

我有一个具有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

0 个答案:

没有答案