Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas to_sql参数&;演出_Python_Sql Server_Pandas_Sqlalchemy_Pyodbc - Fatal编程技术网

Python Pandas to_sql参数&;演出

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

我目前正在尝试稍微调整一些脚本的性能,似乎瓶颈总是使用pandas to_sql函数实际插入DB(=MSSQL)

影响这一点的一个因素是mssql的参数限制2100

我与sqlalchemy(mssql+pyodbc)建立了联系:

插入时,我使用chunksize(因此我保持在参数限制和method=“multi”)以下:

这会导致以下(不幸的是,极不一致)性能:

我不知道该怎么想:

  • 不一致性似乎源于数据库服务器本身
  • 更大的块大小似乎不能转化为更好的性能(似乎相反!)
  • 也许我应该从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)