使用 SQL Server 提高 pandas 的 to_sql() 性能

Nea*_*ras 3 python sql-server sqlalchemy pyodbc pandas

我来找你是因为我无法解决pandas.DataFrame.to_sql()方法的问题。

我已经在我的脚本和数据库之间建立了连接,我可以发送查询,但实际上它对我来说太慢了。

我想找到一种方法来提高我的脚本的性能。也许有人会找到解决方案?

这是我的代码:

  engine = sqlalchemy.create_engine(con['sql']['connexion_string'])
  conn = engine.connect()
  metadata = sqlalchemy.Metadata()
  try : 
    if(con['sql']['strategy'] == 'NEW'): 
      query = sqlalchemy.Table(con['sql']['table'],metadata).delete()
      conn.execute(query)
      Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
    elif(con['sql']['strategy'] == 'APPEND'):
      Sql_to_deploy.to_sql(con['sql']['table'],engine,if_exists='append',index = False,chunksize = 1000,method = 'multi')
    else:
      pass
  except Exception as e:
    print(type(e))
Run Code Online (Sandbox Code Playgroud)

当我退出 chunksize 和方法参数时,它正在工作,而且太慢了,这一刻它太慢了(30000 行几乎需要 3 分钟)。当我输入这些参数时,我得到一个sqlalchemy.exc.ProgrammingError...

感谢您的帮助 !

Gor*_*son 7

因为如果您这样mssql+pyodbc做,您将获得最佳表现to_sql

  1. 使用 Microsoft 的 SQL Server ODBC 驱动程序,以及
  2. fast_executemany=True在您的通话中启用create_engine

例如,此代码在我的网络上运行只需 3 秒多一点:

from time import perf_counter
import pandas as pd
import sqlalchemy as sa

ngn_local = sa.create_engine("mssql+pyodbc://mssqlLocal64")
ngn_remote = sa.create_engine(
    (
        "mssql+pyodbc://sa:_whatever_@192.168.0.199/mydb"
        "?driver=ODBC+Driver+17+for+SQL+Server"
    ),
    fast_executemany=True,
)

df = pd.read_sql_query(
    "SELECT * FROM MillionRows WHERE ID <= 30000", ngn_local
)

t0 = perf_counter()
df.to_sql("pd_test", ngn_remote, index=False, if_exists="replace")
print(f"{perf_counter() - t0} seconds")
Run Code Online (Sandbox Code Playgroud)

而使用fast_executemany=False(默认)相同的过程需要 143 秒(2.4 分钟)。