[我目前正在尝试稍微调整一些脚本的性能,并且似乎瓶颈始终是使用pandas to_sql函数实际插入数据库(= MSSQL)的瓶颈。
其中一个影响因素是mssql的参数限制2100。
我与sqlalchemy建立了连接(具有mssql + pyodbc风味):
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params, fast_executemany=True)
在插入时,我使用chunksize(所以我保持在参数限制和method =“ multi”以下):
dataframe_audit.to_sql(name="Audit", con=connection, if_exists='append', method="multi",
chunksize=50, index=False)
我不确定该怎么看:
有什么想法可以为我的DataFrame带来更好的插入性能?
如果在SQLAlchemy fast_executemany=True
调用中将最新版本的pyodbc与ODBC驱动程序17一起用于SQL Server和create_engine
,则应在method=None
调用中使用to_sql
(默认设置)。这样,pyodbc可以使用ODBC参数数组,并在该设置下提供最佳性能。您将不会达到2100个参数的SQL Server存储过程限制(除非您的DataFrame有〜2100列)。您将面临的唯一限制是,如果您的Python进程在将其发送到SQL Server之前没有足够的内存来构建整个参数数组。
method='multi'
的to_sql
选项仅适用于使用不支持参数数组的ODBC驱动程序(例如FreeTDS ODBC)时的pyodbc。在这种情况下,fast_executemany=True
将无济于事,并且可能实际上会导致错误。