熊猫to_sql参数和性能

时间:2019-12-22 12:22:48

标签: python sql-server pandas sqlalchemy pyodbc

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

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

我不确定该怎么看:

  • 不一致似乎源于DB Server本身
  • 更大的块大小似乎并不能转化为更好的性能(反之亦然!)
  • 也许我应该从pyodbc切换到turbodbc(根据一些帖子,它会产生更好的性能)

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

1 个答案:

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