我们有一个用 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/