我有一个从本地日志读取的应用程序,它构成每行的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。
答案 0 :(得分:-2)
这是真的:executemany没有为pyodbc批量插入。您可以使用多值插入或将bcp作为shell命令调用。希望,它将在最近的将来得到修复。插入速度还取决于表结构和底层硬件。