我一直在尝试将相对较小的 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
COPY FROM
或在您的情况下使用
COPY INTO
将该 csv 插入表中。或者甚至使用镶木地板,但我没有这样做过。
您可以在