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

标签 mysql sql-server python-3.x postgresql pyodbc

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

最佳答案

当 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)

向 MySQL 服务器发送单个 INSERT 语句

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 支持通过 fast_executemany 向 SQL Server 进行多行插入。 Cursor 对象的属性,所以

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 示例基本相同。

关于mysql - SQLServer pyodbc 的 Python 驱动程序比 psycopg2 和带有插入的 mysql.connector 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50984207/

相关文章:

php - 如何在php中做href

mysql - 使用带有时区的 NOW() 从 MySQL 选择日期会改变结果

sql - 尝试确定特定零件号的下一个机器操作是什么

sql-server - Distinct 和 Group By 的性能何时不同?

python - “dict_keys”对象不支持索引

mysql - 如何在 SQL 查询中分割特定字符后的字符串

php - 如何将多对多关系查询结果放入yii2中的 GridView 中?

sql-server - TSQL - 逆透视多个列

python - PyQt 5 QTableWidget.cellClicked 信号不工作

python - 在 Python 中测试生成器