Python Pandas to_sql参数&;演出
我目前正在尝试稍微调整一些脚本的性能,似乎瓶颈总是使用pandas to_sql函数实际插入DB(=MSSQL) 影响这一点的一个因素是mssql的参数限制2100 我与sqlalchemy(mssql+pyodbc)建立了联系: 插入时,我使用chunksize(因此我保持在参数限制和method=“multi”)以下: 这会导致以下(不幸的是,极不一致)性能: 我不知道该怎么想:Python Pandas to_sql参数&;演出,python,sql-server,pandas,sqlalchemy,pyodbc,Python,Sql Server,Pandas,Sqlalchemy,Pyodbc,我目前正在尝试稍微调整一些脚本的性能,似乎瓶颈总是使用pandas to_sql函数实际插入DB(=MSSQL) 影响这一点的一个因素是mssql的参数限制2100 我与sqlalchemy(mssql+pyodbc)建立了联系: 插入时,我使用chunksize(因此我保持在参数限制和method=“multi”)以下: 这会导致以下(不幸的是,极不一致)性能: 我不知道该怎么想: 不一致性似乎源于数据库服务器本身 更大的块大小似乎不能转化为更好的性能(似乎相反!) 也许我应该从pyodb
- 不一致性似乎源于数据库服务器本身
- 更大的块大小似乎不能转化为更好的性能(似乎相反!)
- 也许我应该从pyodbc切换到turbodbc(根据一些帖子,它可以产生更好的性能)
为我的数据帧获得更好的插入性能有什么想法吗?如果您在SQLAlchemy
create_engine
调用中使用最新版本的pyodbc和用于SQL Server的ODBC驱动程序17以及fast_ExecuteMay=True
,那么您应该在to_SQL
调用中使用方法=None
(默认值)。这将允许pyodbc使用ODBC参数数组,并在该设置下为您提供最佳性能。您不会达到SQL Server存储过程2100个参数的限制(除非您的数据框有~2100列)。您将面临的唯一限制是Python进程在发送到SQL Server之前没有足够的内存来构建整个参数数组
当使用不支持参数数组的ODBC驱动程序(例如FreeTDS ODBC)时,
to_sql
的method='multi'
选项仅适用于pyodbc。在这种情况下,fast\u executemany=True
不会有帮助,可能会导致错误。Hi,这是我目前的设置(RHEL上的Freetds)。在没有fast_executemany参数的情况下进行了尝试,至少获得了大致相同的性能。在这种情况下,如果我使用适用于Microsoft的ODBC驱动程序17,会对我的情况有所帮助吗?是的。FreeTDS ODBC不支持fast\u executemany=True
,但Microsoft的“SQL Server ODBC驱动程序17”支持。最后一点意见是,在centos上安装mssql驱动程序,并使用Gord Thompson提到的优化过的100k记录文件进行测试-->从大约2分钟缩短到10秒:)
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params, fast_executemany=True)
dataframe_audit.to_sql(name="Audit", con=connection, if_exists='append', method="multi",
chunksize=50, index=False)