您可以并行或异步运行“pd.read_sql”吗?

Posted

技术标签:

【中文标题】您可以并行或异步运行“pd.read_sql”吗?【英文标题】:Can you run `pd.read_sql` in parallel or asyncronously? 【发布时间】:2022-01-19 14:15:30 【问题描述】:

我有一个函数需要运行三个 SQL 查询来获取一些数据,然后返回一个计算。

类似:

df1 = pd.read_sql('''...''', cnxn) # Takes 5min
df2 = pd.read_sql('''...''', cnxn) # Takes 25min
df3 = pd.read_sql('''...''', cnxn) # Takes 20min
ans = my_calculation(df1, df2, df3)

有没有办法将数据并行加载到df1df2df3 中?或者您建议的任何其他技巧来改善运行时间。据我所知,我的数据库能够以最小的速度同时运行所有三个查询。

【问题讨论】:

尝试阅读:***.com/questions/56940321/… 【参考方案1】:

据我所知,我的数据库能够以最小的速度同时运行所有三个查询。

这有点不太可能。 SQL Server 支持并行查询,因此没有明显的理由说明同时启动三个查询实际上比顺序运行更好。即使 SQL Server 可以并行运行它们,您也可能在网络上遇到瓶颈,或者在客户端读取结果时遇到瓶颈。

当然,您可以通过在 3 个单独的程序中运行查询来测试这一点,如果这确实有帮助,请使用 multiprocessing 包对多进程并行性进行编码,以扇出多个进程并将结果编组回一个进程。

但是提高查询执行时间的正常方法是在 SQL Server 上,而不是在客户端上。首先查看Query Store 和/或检查Session Wait Stats,例如

stats = pd.read_sql('''select * 
from sys.dm_exec_session_wait_stats
where session_id = @@spid
order by wait_time_ms desc''', cnxn) # gather the session wait stats

【讨论】:

我很确定我的 Python 代码在启动 df2 之前正在等待获取 df1 的数据 感谢您对会话等待时间的想法。在三个单独的 Jupyter Notebook 中运行三个查询会导致所有三个查询都在 30 分钟内完成(如果一个接一个运行则需要 50 分钟)

以上是关于您可以并行或异步运行“pd.read_sql”吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 `mysql.connector` 使用 `pd.read_sql`

pd.read_sql字符类型

窗口函数在 pd.read_sql 中不起作用;它显示错误

SPA 可以针对单个 GraphQL 服务器发出并行异步查询吗?

异步/IO 和并行

android中的asynctask可不可以并行执行多个