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