SQLServer pyodbc的Python驱动程序比psycopg2和带插入的mysql.connector要慢得多

问题描述 投票:0回答:1

我们有一个用Python构建的应用程序,它必须在不同的数据库上运行,例如SQLServer,MySQL和Postgres。当我们使用pyodbc库插入SQL Server时,这比使用psycopg2在Postgres中进行相同插入或使用mysql.connector进入MySQL时要慢得多(20倍!)。我有两个问题:1。这种性能差异的原因是什么? 2.我们能做什么(除了使用Postgres / MySQL)?

mysql sql-server python-3.x postgresql pyodbc
1个回答
0
投票

当MySQL Connector / Python遇到对INSERT语句的executemany调用时,它会构造一个或多个多行INSERT,从而减少到服务器的往返次数。例如,

crsr = cnxn.cursor()
sql = "INSERT INTO mytable (id) VALUES (%s)"
params = [(x,) for x in range(3)]
crsr.executemany(sql, params)

将单个INSERT语句发送到MySQL服务器

INSERT INTO mytable (id) VALUES (0),(1),(2)

相比之下,pyodbc的默认行为是发送单独的INSERT语句,所以

crsr = cnxn.cursor()
sql = "INSERT INTO mytable (id) VALUES (?)"
params = [(x,) for x in range(3)]
crsr.executemany(sql, params)

发送相当于

INSERT INTO mytable (id) VALUES (0)
INSERT INTO mytable (id) VALUES (1)
INSERT INTO mytable (id) VALUES (2)

需要三次往返服务器而不是一次。

幸运的是,当前版本的pyodbc通过Cursor对象的fast_executemany属性支持SQL Server的多行INSERT,所以

crsr = cnxn.cursor()
sql = "INSERT INTO mytable (id) VALUES (?)"
params = [(x,) for x in range(3)]
crsr.fast_executemany = True
crsr.executemany(sql, params)

产生与上面的MySQL Connector / Python示例基本相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.