我们有一个用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)
将单个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示例基本相同的结果。