2016-03-30 11 views
0

Ich bevölke eine mittelgroße Tabelle (60 GB, 500 Millionen Zeilen). Der Prozess wird relativ schnell abgeschlossen, wenn die Tabelle keinen Primärschlüssel enthält (~ 1 Stunde mit Masseneinfügung), aber es dauert ~ 10 mal länger, wenn ich diese Tabelle mit dem Primärschlüssel erstelle. Ich nehme an, dies ist, weil es Zeit braucht, um die Eindeutigkeitseinschränkung zu überprüfen und auch den Index bei jeder Einfügung zu aktualisieren.Leistungsproblem mit Primärschlüssel

Ich dachte, eine gute Problemumgehung wäre, den Primärschlüssel später hinzuzufügen, da die Indexierung für die Tabelle, die bereits gefüllt ist, im Vergleich zur inkrementellen Indexierung viel schneller sein sollte. Aber sqlite scheint nicht die Option zu haben, den Primärschlüssel hinzuzufügen, nachdem die Tabelle erstellt wurde (nicht sicher, warum?).

Ich denke, ich könnte einfach überhaupt keinen Primärschlüssel verwenden und stattdessen einfach einen eindeutigen Index hinzufügen, nachdem die Tabelle ausgefüllt ist. Hat das einen Nachteil?

Oder eine bessere Lösung empfohlen?

Antwort

1

Aus rein technischer Sicht hat ein eindeutiger Index genau die gleiche Wirkung wie ein Primärschlüssel. (In SQLite erlauben einige Primärschlüssel NULL für Abwärtskompatibilität.)

Der einzige Unterschied besteht darin, dass die Primärschlüsseleinschränkung nicht in der Tabellendefinition selbst angezeigt wird, was für Dokumentationszwecke eine schlechte Sache sein könnte.

Siehe auch Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLite.

+0

Aber gemäß Ihrer verknüpften Antwort könnte der Primärschlüssel den Leistungsvorteil haben, wenn er in einer INTEGER-Spalte ist? – max

+0

Ja, aber Ihre Tabelle hat einen anderen Typ verwendet. –

+1

Ein INTEGER PRIMARY KEY hätte die Insertionen nicht verlangsamt. –

0

Führen Sie die Bulk-Einfügung innerhalb einer Transaktion aus, und Sie werden viele Dinge vermeiden, die das Einfügen verlangsamen.

Ich habe gerade gefunden, das ist ein großartiger Bericht darüber, wie man Dinge in sqlite3 beschleunigen kann.

Improve INSERT-per-second performance of SQLite?