Heim >Backend-Entwicklung >Python-Tutorial >Wie beschleunigt man Masseneinfügungen in MS SQL Server mit Pyodbc?

Wie beschleunigt man Masseneinfügungen in MS SQL Server mit Pyodbc?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 16:21:02280Durchsuche

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

Beschleunigung der Masseneinfügung in MS SQL Server mit Pyodbc

Masseneinfügungsvorgänge können die Leistung beim Einfügen großer Datensätze in Microsoft SQL Server erheblich verbessern. Dieser Artikel untersucht alternative Ansätze zur Optimierung solcher Einfügungen und geht dabei auf die spezifischen Herausforderungen ein, mit denen der in der Frage bereitgestellte Code konfrontiert ist.

Alternative Ansätze

  1. Fast Executemany (Pyodbc 4.0.19): Neuere Versionen von Pyodbc (4.0.19) bieten die Funktion Cursor#fast_executemany, die die Ausführung mehrzeiliger Einfügungen beschleunigen soll. Wenn Sie crsr.fast_executemany auf „True“ setzen, können Sie möglicherweise eine deutliche Leistungssteigerung im Vergleich zur Standardmethode „executemany“ erzielen.

    <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. Iterieren mit Pandas DataFrame: Alternativ können Sie Pandas verwenden, um Ihre CSV-Daten in einen DataFrame einzulesen und dessen optimierte to_sql()-Methode zu nutzen. Dieser Ansatz optimiert das Einfügen von Daten und unterstützt verschiedene Optimierungen wie Chunking und Typkonvertierungen.

    <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. Bulk Copy Interface (BCP): Das Bulk Copy Interface ( BCP) ist ein natives SQL Server-Dienstprogramm, das eine schnelle Datenübertragung zwischen Dateien und Datenbanktabellen ermöglicht. BCP bietet mehrere Leistungsvorteile gegenüber Standard-SQL-INSERT-Anweisungen.

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

Leistungsvergleich

Der optimale Ansatz für Ihr spezifisches Szenario hängt von Faktoren wie Datengröße und Server ab Konfiguration und verfügbare Ressourcen. Im Allgemeinen bietet fast_executemany eine erhebliche Leistungsverbesserung gegenüber der Iteration über einen Cursor, während BCP in Masseneinfügungsszenarien häufig beide übertrifft.

Zusätzliche Überlegungen

  • Datenprofilerstellung: Stellen Sie sicher, dass Ihre Daten korrekt formatiert und eingegeben sind, um SQL-Konvertierungsfehler zu vermeiden, die den Einfügevorgang verlangsamen können.
  • Server-Hardware: Stellen Sie sicher, dass Ihre SQL Server-Instanz über ausreichend Arbeitsspeicher, CPU usw. verfügt Speicherressourcen, um den Masseneinfügungsvorgang effizient abzuwickeln.
  • Dateispeicherort: Für den T-SQL-Befehl BULK INSERT muss sich die CSV-Datei auf demselben Server oder einer zugänglichen Netzwerkfreigabe befinden. Fast_executemany und Pandas to_sql() hingegen sind hinsichtlich des Dateispeicherorts flexibler.

Das obige ist der detaillierte Inhalt vonWie beschleunigt man Masseneinfügungen in MS SQL Server mit Pyodbc?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn