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.
Testen Sie DDL
CREATE TABLE test01
(key serial PRIMARY KEY,
text_val text);
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()
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 |
execute_values, schnell. Verwenden Sie es, wenn Sie können.
Recommended Posts