2016-04-21 7 views
1

Ich verwende derzeit die folgende Abfrage, um in eine Tabelle nur einzufügen, wenn der Datensatz nicht bereits vorhanden ist, vermutlich führt dies zu einem Tabellenscan. Es fügt 28.000 Datensätze in 10 Minuten:Zunehmende INSERT-Geschwindigkeit

INSERT INTO tblExample(column) 
(SELECT ? FROM tblExample WHERE column=? HAVING COUNT(*)=0) 

Wenn ich die Abfrage an den folgenden ändern, ich 98.000 Datensätze in 10 Minuten eingeben:

INSERT INTO tblExample(column) VALUES (?) 

Aber es wird nicht, ob der Datensatz wird Überprüfung bereits existiert.

Kann jemand eine andere Art der Abfrage vorschlagen, so dass meine Insert-Geschwindigkeit schneller ist?

+4

Haben Sie einen eindeutigen Index für die Spalte? Das würde sowohl die Suchabfrage beschleunigen als auch die Einschränkung erzwingen (falls Sie es in Ihrem Code verpasst haben). – Thilo

+0

Danke @Thilo. Ich habe den Primärschlüssel von der Tabelle genommen, weil ich gelesen habe, dass ein PK erhöht die Zeit für das Einfügen erhöht. Schlägst du vor, dass ich einen PK benutze und den Fehler erhalte, wenn ein Duplikat gefunden wird? – jdie8274j

+0

Mit dem PK wird die Einfügung verlangsamt, aber wenn Sie nicht sicher sind, dass die Daten eindeutig sind, benötigen Sie diese Einschränkung Validierung. Also ja, zieh es wieder an. – Thilo

Antwort

1

Eine einfache Lösung (aber nicht empfohlen) könnte sein, einfach insert Anweisung zu haben, doppelte Schlüssel Ausnahme zu fangen und sie zu protokollieren. Angenommen, die Tabelle hat eine eindeutige Schlüsseleinschränkung.

+0

Woher wissen Sie, dass es einen eindeutigen Index gibt? – Thilo

+0

Sorry, aktualisiert meine Antwort. –

+0

Das ist, was ich gegangen bin und die Leistung hat sich wirklich verbessert. Vielen Dank! – jdie8274j

1

Stellen Sie sicher, dass Sie einen Index für die Spalte (n) haben, die Sie überprüfen. Sehen Sie sich im Allgemeinen den Abfrageausführungsplan an, den die Datenbank verwendet. Dies sollte Ihnen sagen, wo die Zeit liegt und was Sie dagegen tun sollten.

Für Derby db ist dies how you get a plan and how to read it.

Derby also has a merge command, die als einfügen-wenn-nicht-dort fungieren können. Ich habe es nicht selbst benutzt, also müsstest du es testen, um zu sehen, ob es für deine Umstände schneller ist.