pyodbc executemany不是批处理插入 - SQL服务器插入很慢

时间:2018-05-15 22:22:31

标签: python sql-server pyodbc

我有一个从本地日志读取的应用程序,它构成每行的JSON对象。它解析每一行并尝试插入SQL Server DB。 SQL服务器在Azure中作为PaaS产品运行。

我将外键放在DB上以加快插入速度,但性能非常慢。

我在python中进行了分析,并在下面找到了。注意执行调用,每个调用时间为60毫秒。

Mon May 14 20:05:05 2018    logparserprof.out

         385055 function calls (384911 primitive calls) in 1832.423 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     11/1    0.000    0.000 1832.423 1832.423 {built-in method builtins.exec}
        1    0.000    0.000 1832.423 1832.423 logparsers.py:1(<module>)
        1    0.212    0.212 1831.728 1831.728 logparsers.py:282(parse)
    12796    0.030    0.000 1816.892    0.142 logparsers.py:240(parse_event)
    30432 1814.571    0.060 1814.571    0.060 {method 'execute' of 'pyodbc.Cursor' objects}
    12471    0.014    0.000 1796.979    0.144 logparsers.py:232(parse_event_Task)

所以我决定批量请求并看到executemany调用并以相似的速度再次运行。 (我试图批量每1000-1500条记录插页)

我再次描述, executemany 花了46秒!

Tue May 15 00:55:46 2018    logparserprof2.out

         384660 function calls (384516 primitive calls) in 1659.800 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       35 1635.272   46.722 1635.272   46.722 {method 'executemany' of 'pyodbc.Cursor' objects}
      335   20.095    0.060   20.095    0.060 {method 'execute' of 'pyodbc.Cursor' objects}

我查看了Windows中的resmon以检查网络延迟,发现平均值为57-60毫秒。

我的下一步是尝试执行多线程并尽可能为应用程序添加并行性。但是,我想知道我是否可以通过批量/批量插入做得更好。

我理解MS SQL服务器批量插入适用于CSV文件,这些文件必须在本地或通过CIFS / SMB ..等访问。

修改 删除了关于executemany简单循环的链接,因为那是来自pymssql而不是pyodbc。

1 个答案:

答案 0 :(得分:-2)

这是真的:executemany没有为pyodbc批量插入。您可以使用多值插入或将bcp作为shell命令调用。希望,它将在最近的将来得到修复。插入速度还取决于表结构和底层硬件。