我当前正在尝试稍微调整一些脚本的性能,并且似乎瓶颈始终是使用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)
我不确定确切要怎么看:
不一致似乎源于DB Server本身 更大的块大小似乎并不能转化为更好的性能(反之亦然!?) 也许我应该从pyodbc切换到turbodbc(根据一些帖子,它会产生更好的性能) 有什么想法可以为我的DataFrame带来更好的插入性能吗?
如果您fast_executemany=True在SQLAlchemy create_engine调用中将pyodbc与ODBC驱动程序17一起使用的是最新版本,则应在调用中使用method=None(默认值)to_sql。这样,pyodbc可以使用ODBC参数数组,并在该设置下提供最佳性能。您将不会达到2100个参数的SQL Server存储过程限制(除非您的DataFrame有〜2100列)。您将面临的唯一限制是,如果您的Python进程没有足够的内存来构建整个参数数组,然后再将其发送到SQL Server。
仅当使用不支持参数数组的ODBC驱动程序(例如FreeTDS ODBC)时,该method='multi'选项to_sql才适用于pyodbc。在这种情况下fast_executemany=True将无济于事,并可能导致错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。