【问题标题】:Pandas to_sql Parameters & PerformancePandas to_sql 参数和性能
【发布时间】:2020-04-14 02:00:24
【问题描述】:

我目前正在尝试稍微调整一些脚本的性能,似乎瓶颈始终是使用 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 服务器本身
  • 更大的块大小似乎并不能转化为更好的性能(似乎反过来!?)
  • 也许我应该从 pyodbc 切换到 turbodbc(根据一些帖子,它会产生更好的性能)

有什么想法可以让我的 DataFrame 获得更好的插入性能?

【问题讨论】:

    标签: python sql-server pandas sqlalchemy pyodbc


    【解决方案1】:

    如果您在 SQLAlchemy create_engine 调用中使用最新版本的 pyodbc 和 ODBC Driver 17 for SQL Server 和 fast_executemany=True,那么您应该在 to_sql 调用中使用 method=None(默认值)。这将允许 pyodbc 使用 ODBC 参数数组并在该设置下为您提供最佳性能。您不会达到 2100 个参数的 SQL Server 存储过程限制(除非您的 DataFrame 有 ~2100 列)。您将面临的唯一限制是,如果您的 Python 进程在将其发送到 SQL Server 之前没有足够的内存来构建整个参数数组。

    to_sqlmethod='multi' 选项仅在使用不支持参数数组的 ODBC 驱动程序(例如,FreeTDS ODBC)时适用于 pyodbc。在这种情况下,fast_executemany=True 将无济于事,实际上可能会导致错误。

    【讨论】:

    • 嗨,这是我目前的设置(RHEL 上的 Freetds)。在没有 fast_executemany 参数的情况下进行了尝试,至少获得了大致相同的性能。如果我使用 Microsoft 的 ODBC 驱动程序 17,在这种情况下会帮助我吗?
    • 是的。 FreeTDS ODBC 不支持fast_executemany=True,但微软的“ODBC Driver 17 for SQL Server”支持。
    • 作为最后的评论,开始在 centos 上安装 mssql 驱动程序并使用 Gord Thompson 提到的优化使用 100k 记录文件进行测试)--> 从大约 2 分钟缩短到 10 秒: )
    猜你喜欢
    • 2017-02-11
    • 2020-11-20
    • 1970-01-01
    • 2018-04-09
    • 2017-05-24
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多