首页  >  文章  >  后端开发  >  如何使用 Pyodbc 加速 MS SQL Server 的批量插入?

如何使用 Pyodbc 加速 MS SQL Server 的批量插入?

Linda Hamilton
Linda Hamilton原创
2024-11-02 16:21:02182浏览

How to Speed Up Bulk Inserts into MS SQL Server Using Pyodbc?

使用 Pyodbc 加速批量插入 MS SQL Server

批量插入操作可以显着提高将大型数据集插入 Microsoft SQL Server 的性能。本文探讨了优化此类插入的替代方法,解决问题中提供的代码所面临的具体挑战。

替代方法

  1. 快速执行许多(Pyodbc 4.0.19): Pyodbc (4.0.19) 的最新版本提供了Cursor#fast_executemany 功能,旨在加速多行插入的执行。通过将 crsr.fast_executemany 设置为 True,与默认的executemany 方法相比,您可能会获得显着的性能提升。

    <code class="python"># Connect to the database and create a cursor with fast_executemany enabled
    cnxn = pyodbc.connect(conn_str, autocommit=True)
    crsr = cnxn.cursor()
    crsr.fast_executemany = True
    
    # Execute the bulk insert operation with parameters
    sql = "INSERT INTO table_name (column1, column2) VALUES (?, ?)"
    params = [(data1, data2) for (record_id, data1, data2) in data]
    crsr.executemany(sql, params)</code>
  2. 使用 Pandas DataFrame 进行迭代: ,您可以使用 Pandas 将 CSV 数据读入 DataFrame 并利用其优化的 to_sql() 方法。这种方法简化了数据插入并支持各种优化,例如分块和类型转换。

    <code class="python">import pandas as pd
    
    # Read CSV data into a DataFrame
    df = pd.read_csv(csv_file)
    
    # Establish a database connection
    engine = sqlalchemy.create_engine(conn_str)
    
    # Insert DataFrame into the database using `to_sql()`
    df.to_sql('table_name', con=engine, if_exists='append', index=False)</code>
  3. 批量复制接口 (BCP):批量复制接口 ( BCP)是一个本机 SQL Server 实用程序,允许在文件和数据库表之间进行高速数据传输。与标准 SQL INSERT 语句相比,BCP 具有多种性能优势。

    bcp {table_name} in {csv_file} -S {server} -d {database} -E

性能比较

适合您的特定场景的最佳方法取决于数据大小、服务器等因素配置和可用资源。一般来说,fast_executemany 比通过游标迭代提供了显着的性能改进,而 BCP 在批量插入场景中通常优于这两种情况。

其他注意事项

  • 数据分析:确保数据格式和类型正确,以避免 SQL 转换错误,从而减慢插入速度
  • 服务器硬件:验证您的 SQL Server 实例是否有足够的内存、CPU 和存储资源来高效处理批量插入操作。
  • 文件位置:对于 T-SQL BULK INSERT 命令,CSV 文件必须位于同一服务器或可访问的网络共享上。另一方面,Fast_executemany 和 Pandas to_sql() 在文件位置方面更加灵活。

以上是如何使用 Pyodbc 加速 MS SQL Server 的批量插入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn