Pandas to_sql参数和性能

问题描述 投票:0回答:1

[我目前正在尝试稍微调整一些脚本的性能,并且似乎瓶颈始终是使用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)

这导致以下(不幸的是非常不一致的)性能:enter image description here

我不确定该怎么看:

  • 不一致似乎源于数据库服务器本身
  • 更大的块大小似乎并不能转化为更好的性能(似乎反过来!!]
  • 也许我应该从pyodbc切换到turbodbc(根据一些帖子,它会产生更好的性能)

有什么想法可以为我的DataFrame带来更好的插入性能?

python sql-server pandas sqlalchemy pyodbc
1个回答
0
投票

如果在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将无济于事,并且可能实际上会导致错误。

© www.soinside.com 2019 - 2024. All rights reserved.