[PYTHON] PostgreSQL - Für Sie, die mit hoher Geschwindigkeit EINFÜGEN möchten

Lassen Sie uns die Leistung von Masseneinsätzen verbessern

Für Masseneinfügungen in PostgresQL Verwenden Sie das Dienstprogramm, um mehrere Datensätze zusammen einzufügen. Überprüfen Sie alternativ die Häufigkeit der Festschreibungsausführung, um unnötige Verarbeitungskosten zu reduzieren.

Messen Sie tatsächlich mit mehreren Mustern und vergleichen Sie die Leistung. In psycopg2 eine der Bibliotheken, die mit Python auf PostgreSQL zugreifen Als Dienstprogramm zum gleichzeitigen Einfügen mehrerer Elemente Verwenden Sie eine Funktion namens execute_values. Ändern Sie auch die Ausführungseinheit des Commits und das Ausführungsintervall des Commits für die tatsächliche Messung.

Vorbereitung zur Bestätigung

Testtabelle

Testen Sie DDL


CREATE TABLE test01
(key serial PRIMARY KEY,
 text_val text);

Testprogramm

Der Einfachheit halber können Sie die Anzahl der Ausführungen und Commits interaktiv eingeben. Schließen Sie den Teil ein, der die Parameter erstellt, damit sie so weit wie möglich im gleichen Zeitraum verglichen werden können. Initialisieren Sie die Werte der Objekte TRUNCATE und SEQUENCE, um die Tabelle jedes Mal vor der Ausführung zurückzusetzen.

Ausführen_Werte sind standardmäßig 100 Zeilen. Wenn Sie mehr als das eingeben, müssen Sie mehr als die Anzahl der Eingaben an das Argument page_size übergeben.

Testprogramm


import psycopg2
from psycopg2.extras import execute_values
from time import time

_text = 'test' * 300

conn = psycopg2.connect('dbname=dbname host=localhost user=username password=password')
cur = conn.cursor()

#Tabellen zurücksetzen
reset_query_tbl = "TRUNCATE TABLE test01;"
cur.execute(reset_query_tbl)
reset_query_seq = "SELECT setval ('test01_key_seq', 1, false);"
cur.execute(reset_query_seq)
count_query = "SELECT count(key) FROM test01;"
cur.execute(count_query)
(count,) = cur.fetchone()
conn.commit()
print('■ Zustand vor der Ausführung')
print('Anzahl der Daten: ', count)
print()

#Testeinstellungen
print('■ INSERT-Methode')
print('Bitte wählen Sie die INSERT-Methode aus den folgenden(0/1/2/3)')
print(' 0:EINFÜGEN nacheinander&commit.')
print(' 1:EINFÜGEN nacheinander&Mehrere gemeinsam festschreiben.')
print(' 2:EINFÜGEN nacheinander&Alle Fälle werden gemeinsam begangen.')
print(' 3:Gemeinsam EINFÜGEN&commit.')
test_type = int(input('INSERT-Methode>'))
test_cnt  = int(input('Anzahl der INSERTs>'))
if test_type == 1:
    commit_cnt  = int(input('COMMIT-Intervall>'))

#Testausführung & Ergebnis
print()
print('■ Ausführungsergebnis')
if test_type==0:

    query = "INSERT INTO test01 (text_val) VALUES ('%s');" % _text
    st = time()
    for _ in range(test_cnt):
        cur.execute(query)
        conn.commit()

    elapsed_time = time() - st
    print('verstrichene Zeit(s): ', elapsed_time)

if test_type==1:
    query = "INSERT INTO test01 (text_val) VALUES ('%s');" % _text
    st = time()
    for i in range(test_cnt):
        cur.execute(query)
        if (i + 1) % commit_cnt == 0:
            conn.commit()

    conn.commit()

    elapsed_time = time() - st
    print('verstrichene Zeit(s): ', elapsed_time)

if test_type==2:

    query = "INSERT INTO test01 (text_val) VALUES ('%s');" % _text
    st = time()
    for _ in range(test_cnt):
        cur.execute(query)

    conn.commit()

    elapsed_time = time() - st
    print('verstrichene Zeit(s): ', elapsed_time)

if test_type==3:

    query = "INSERT INTO test01 (text_val) VALUES %s;"
    st = time()

    params = []
    for _ in range(test_cnt):
        params += [(_text,)]

    ret = execute_values(cur, query, params, page_size=test_cnt)
    conn.commit()
    elapsed_time = time() - st
    print('verstrichene Zeit(s): ', elapsed_time)

cur.execute(count_query)
(count,) = cur.fetchone()
print('Anzahl der Daten: ', count)

cur.close()
conn.close()

Leistungsergebnisse

Die Ergebnisse dienen nur als Referenz. Dies hängt natürlich von der Umgebung und den Maschinenspezifikationen ab.

--Windows10 64bit / Anzahl der logischen Prozessoren 4 / Speicher 8GB

INSERT-Methode Anzahl der INSERTs COMMIT zählen Verarbeitungszeit(S)
EINFÜGEN nacheinander(execute) &COMMIT eins nach dem anderen. 100,000 100,000 40.9
EINFÜGEN nacheinander(execute) &Jeweils 10 COMMITs. 100,000 10,000 25.4
EINFÜGEN nacheinander(execute) &100 je COMMIT. 100,000 1,000 24.1
EINFÜGEN nacheinander(execute) & 1,000 COMMIT. 100,000 100 27.2
EINFÜGEN nacheinander(execute) & 10,Commit von 000. 100,000 10 25.9
EINFÜGEN nacheinander(execute) &Alle Fälle zusammen verpflichten. 100,000 1 24.4
Gemeinsam EINFÜGEN(execute_values) &Alle Fälle zusammen verpflichten. 100,000 1 8.8

Fazit

execute_values, schnell. Verwenden Sie es, wenn Sie können.

Recommended Posts

PostgreSQL - Für Sie, die mit hoher Geschwindigkeit EINFÜGEN möchten
So erstellen Sie große Dateien mit hoher Geschwindigkeit
Ärgerliche Punkte für diejenigen, die Ansible vorstellen möchten
Für diejenigen, die Python mit vim schreiben möchten
Für diejenigen, die mit TensorFlow2 maschinelles Lernen beginnen möchten
Referenz Referenz für diejenigen, die mit Rhinoceros / Grasshopper codieren möchten
PyPI-Registrierungsverfahren für diejenigen, die ihr PyPI-Debüt geben möchten
[Python] Wie man den Bruchteil einer natürlichen Zahl mit hoher Geschwindigkeit erhält
Lose Artikel für diejenigen, die mit der Verarbeitung natürlicher Sprache beginnen möchten
Python-Technik für diejenigen, die Anfänger loswerden wollen
Ich habe Airbnb-Daten für diejenigen analysiert, die in Amsterdam bleiben möchten
Treten Sie Azure mit Go ~ bei Für diejenigen, die Azure mit Go ~ starten und kennenlernen möchten
Für diejenigen, die Excel VBA lernen und mit Python beginnen möchten
5 Gründe, warum die Verarbeitung für diejenigen nützlich ist, die mit Python beginnen möchten
[Flask + Keras] So schließen Sie mehrere Modelle mit hoher Geschwindigkeit auf dem Server ab
Ich möchte einen DataFrame in MSSQL einfügen
Der erste Schritt des maschinellen Lernens ~ Für diejenigen, die versuchen möchten, mit Python zu implementieren ~
Umgebungskonstruktion für diejenigen, die Python einfach mit VSCode (für Mac) lernen möchten