このテーブルで:
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
は次のとおりです。
- プリペアドステートメント
- すべてのパラメータをバインドする
- 実行する