首页 > 解决方案 > 从 python 行列表缓慢插入 Azure SQL 数据库

问题描述

大家好,我正在努力解决这个问题:我正在尝试使用以下代码在 azure db 中插入一个由大约 100k 行组成的 python 列表:

list_of_rows = [...]
self.azure_cursor.fast_executemany = True
self.azure_cursor.executemany('''INSERT INTO table_name VALUES(?,?,?,?,?,?,?,?,?,?,?)''',list_of_rows)

问题是这样做需要很长时间(对于 100k 行大约需要 43 秒,对于少于 30 MB 的数据量)而且我不知道如何改进它,因为我已经在使用 fast_executemany 并且从天蓝色仪表板我没有达到订阅计划授予的最大 DTU (S1-20 DTU)。我还尝试查看索引是否有帮助,但没有任何优势(并且尝试在 SSMS 中运行查询不建议使用索引)。最后,问题不在于连接,因为我使用的是 1Gb/s 下载/上传

有人知道如何提高这些性能吗?

更新

尝试按照 Shiraz Bhaiji 链接的页面中的建议使用以下代码:

首先,我从我的行列表中创建一个 pandas 数据框,然后设置引擎并创建事件侦听器,然后我使用 df.to_sql

self.df = pd.DataFrame(data = list_of_rows , columns=['A','B','C'])
params='DRIVER=driver;SERVER=server;PORT=1433;DATABASE=databas;UID=username;PWD=password'
db_params = urllib.parse.quote_plus(params)
self.engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(db_params))

@event.listens_for(self.engine, "before_cursor_execute")
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
          cursor.fast_executemany = True
df.to_sql('table_name', self.engine, index=False, if_exists="append", schema="dbo")
    

下面的代码与纯 executemany 的时间相同。我试图删除 PK(表上没有其他索引),它使插入速度更快,现在需要 22 秒,但对于 100k 行来说太多了,对于 30 MB 的数据总量

标签: azure

解决方案


如果您改用 to_sql 函数,则可以加快插入速度。

请参阅:https ://medium.com/analytics-vidhya/speed-up-bulk-inserts-to-sql-db-using-pandas-and-python-61707ae41990


推荐阅读