【发布时间】:2011-08-07 07:47:01
【问题描述】:
有了这张桌子:
CREATE TABLE test_insert (
col1 INT,
col2 VARCHAR(10),
col3 DATE
)
以下代码需要 40 秒才能运行:
import pyodbc
from datetime import date
conn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};'
'SERVER=localhost;DATABASE=test;UID=xxx;PWD=yyy')
rows = []
row = [1, 'abc', date.today()]
for i in range(10000):
rows.append(row)
cursor = conn.cursor()
cursor.executemany('INSERT INTO test_insert VALUES (?, ?, ?)', rows)
conn.commit()
与 psycopg2 的等效代码只需要 3 秒。我不认为 mssql 比 postgresql 慢得多。关于如何在使用 pyodbc 时提高批量插入速度的任何想法?
编辑:在 ghoerz 的发现之后添加一些注释
在pyodbc中,executemany的流量为:
- 准备声明
- 为每组参数循环
- 绑定参数集
- 执行
在ceODBC中,executemany的流向是:
- 准备声明
- 绑定所有参数
- 执行
【问题讨论】:
-
尝试使用显式事务。
-
阅读stackoverflow.com/questions/1063770/…,pyodbc 似乎不支持显式事务。
-
我不是这样读的。您关闭自动提交,并且必须显式调用回滚或提交。但是,我不知道它是否会有所作为,但我会自己尝试。
-
您所描述的正是我的代码所做的。自动提交默认关闭。
-
我看不出有什么原因会变慢。什么版本的 SQL Server,安装是标准安装,即没有有趣的配置等?喜欢从 USB 等运行数据库?您也可以尝试将 SQL Profiler 附加到数据库,看看您是否可以发现效率低下的原因,但是您在 c# 中的等效代码在我的电脑上执行不到 3 秒。
标签: sql-server bulkinsert pyodbc