即使使用快速参数选项,将 Pandas 数据帧写入 MS SQL Server 也太慢

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

我一直在尝试将相对较小的 Pandas Dataframe(约 200K 条记录)插入到 Azure Synapse。为此,我围绕 PYODBC 和 SQLAlchemy API 尝试了许多不同的方法和途径。

但是,无论采用哪种方法,我注意到我的数据帧到 SQL Server 的写入速度只是 ~ 10 条记录/秒。这显然是不可行的,出乎意料的,但最重要的是,它的原因对我来说是个谜。

我花了很多时间在网上搜索有关如何提高写入速度的资源,并发现很多人提出类似的问题并寻求建议。

我知道创建

.fast_executemany

 时的 
SQLAlchemy.engine
 选项据说可以大大加快写入速度,但正如您所看到的,即使使用它,结果也不理想。

我也尝试过在

executemany

 上使用 
cursor
,但结果具有
完全相同的性能。

我所做的另一次尝试是使用

turbodbc

产生了相同的性能。

我的数据框有 11 列,除了一列之外都是

float

从我在

文档中读到的内容来看,fast_executemany

选项应该尝试适应整个数据帧
内存中,但是在操作过程中,我注意到我的计算机的内存消耗没有改变

我真的很不知所措。关于其原因和补救措施有什么想法吗?

这是我的代码:

import pandas as pd import sqlalchemy import pyodbc from sqlalchemy.engine import URL, create_engine conn = pyodbc.connect('Driver=ODBC Driver 17 for SQL Server;' 'Server=SERVERNAME;' 'Database=DATABASENAME;' 'MARS_Connection=yes;' 'UID=USER;' 'PWD=PASS;') connstring = "Driver={ODBC Driver 17 for SQL Server};Server=SERVERNAME;Database=DATABASENAME;UID=USER;PWD=PASS;" conurl = URL.create("mssql+pyodbc", query={"odbc_connect":connstring,'autocommit':'True'}) dbEngine = sqlalchemy.create_engine(conurl, fast_executemany=True) #for the sake of this example I only have 2 columns d = {'userid': ['21005395', '20101499'], 'col1': [0.1, 0.25]} df = pd.DataFrame(data=d) #Even when only inserting 1K rows, the time to complete is ~130secs df.head(1000).to_sql( name = 'databaseTable' , con = dbEngine , schema = 'schema' , method = None , index = False , chunksize = 500 , dtype = { 'userid' : sqlalchemy.types.NVARCHAR(10) , if_exists='replace')
环境,使用Anaconda 2.6.3:

Python:2014 年 10 月 3 日

pyodbc:5.1.0
熊猫:2.2.3
sqlalchemy:2.0.34

python sql-server pandas sqlalchemy pyodbc
1个回答
0
投票
你的每秒10条记录对我来说似乎很低。我想调查瓶颈在哪里可能是值得的。但是,我发现如果您需要最大的插入性能,您应该将数据写入 csv,然后使用

COPY FROM

 或在您的情况下使用 
COPY INTO
 将该 csv 插入表中。或者甚至使用镶木地板,但我没有这样做过。

您可以在

here 看到该模式如何与 Postgresqls psycopg2 配合使用,但它与 pyodbc 类似。

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