您可以并行或异步运行“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)
有没有办法将数据并行加载到df1
、df2
和df3
中?或者您建议的任何其他技巧来改善运行时间。据我所知,我的数据库能够以最小的速度同时运行所有三个查询。
【问题讨论】:
尝试阅读:***.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`