【问题标题】:Slow inserts via python script even its just 400 rows通过 python 脚本缓慢插入,即使只有 400 行
【发布时间】:2019-08-26 01:40:23
【问题描述】:

我有一个 400 行的“数据框”。

当我尝试将数据推送到 SQL Server(在 azure VM 上)时,插入大约需要 4 分钟。

下面是我正在使用的exceutemany 语句:

cursor.executemany(insert_query,df)

我知道cursor.executemany 会逐行插入,但对于 400 行来说,它需要 4 分钟有点奇怪。

您能帮我解决一下这个问题吗?

【问题讨论】:

  • 认为这是 pymssql 的问题。这是 github github.com/pymssql/pymssql/issues/332 上列出的问题的链接。根据其中一条评论,有一种解决方法是使用fast_executemanygithub.com/pymssql/pymssql/issues/332#issuecomment-472371207
  • 您好 Hue,如果我的回答对您有帮助,您可以接受或投票。这对其他社区成员可能是有益的。谢谢。
  • @LeonYue :是的,Fast_exexcutemany 确实减少了插入时间。
  • @Hue 很高兴我的回答对您有所帮助。你能考虑接受(标记)吗?

标签: python sql-server pandas azure-sql-database


【解决方案1】:

请参考此文档Pyodbc Cursor`。 你可以executemany(sql, *params), with fast_executemany=True

对整个参数集执行 SQL 语句,返回 None。单个 params 参数必须是序列序列,或序列生成器。

params = [ ('A', 1), ('B', 2) ]
cursor.fast_executemany = True
cursor.executemany("insert into t(name, id) values (?, ?)", params)

在这里,所有参数都以一个包的形式(连同 SQL 语句)发送到数据库服务器,并且数据库作为一个数据库事务对所有参数执行 SQL。因此,这种形式的 executemany() 应该比默认的 executemany() 快得多。但是,它有一些限制,请参阅fast_executemany 了解更多详细信息。

请修改您的代码并再次测试:

cursor.fast_executemany = True
cursor.executemany(insert_query,df)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2011-05-01
    • 2014-12-05
    相关资源
    最近更新 更多