Das Erstellen eines Index nach dem Einfügen von Daten ist effizienter (es wird sogar häufig empfohlen, den Index vor dem Stapelimport zu löschen und nach dem Import neu zu erstellen).
Synthetisches Beispiel (PostgreSQL 9.1, langsame Entwicklungsmaschine, eine Million Zeilen):
CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 7816.561 ms
CREATE INDEX test1_x ON test1 (x);
-- Time: 4183.614 ms
Index einfügen und dann erstellen - ca. 12 Sek
CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
-- Time: 2.315 ms
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 25399.460 ms
Index erstellen und dann einfügen - ca. 25,5 Sekunden (mehr als zweimal langsamer)
Es ist wahrscheinlich besser, den Index nach dem Hinzufügen der Zeilen zu erstellen. Es wird nicht nur schneller sein, sondern der Baumausgleich wird wahrscheinlich besser sein.
Das Bearbeiten von "Balancing" ist hier wahrscheinlich nicht die beste Auswahl an Begriffen. Im Fall eines B-Baums ist er per Definition ausgeglichen. Dies bedeutet jedoch nicht, dass der B-Baum das optimale Layout hat. Die Verteilung der untergeordneten Knoten innerhalb der Eltern kann ungleichmäßig sein (was zu höheren Kosten bei zukünftigen Aktualisierungen führt), und die Baumtiefe kann tiefer als erforderlich sein, wenn der Ausgleich während der Aktualisierungen nicht sorgfältig durchgeführt wird. Wenn der Index nach dem Hinzufügen der Zeilen erstellt wird, ist die Verteilung wahrscheinlicher. Darüber hinaus sind Indexseiten auf der Festplatte nach dem Erstellen des Index möglicherweise weniger fragmentiert. Ein bisschen mehr Informationen hier
quelle
Dies spielt bei diesem Problem keine Rolle, weil:
O(n*log(N))
länger (wobein
Zeilen hinzugefügt werden). Da die Baumgerating-ZeitO(N*log(N))
dann ist, wenn Sie diese in alte und neue Daten aufteilen, können SieO((X+n)*log(N))
diese einfach in konvertierenO(X*log(N) + n*log(N))
und in diesem Format können Sie einfach sehen, worauf Sie zusätzlich warten werden.n
neue Zeilen) erhalten Sie mehr ZeitO(log(N))
zum Einfügen der zusätzlichen Struktur, die zum Wiederherstellen der Struktur des Baums nach dem Hinzufügen eines neuen Elements erforderlich ist (Indexspalte aus neuer Zeile, da der Index bereits vorhanden ist und eine neue Zeile hinzugefügt wurde, muss der Index auf ausgeglichen neu generiert werden Struktur, diese Kosten,O(log(P))
woP
ist eine Indexleistung [Elemente im Index] ). Sie habenn
neue Zeilen dann schließlich haben Sien * O(log(N))
dannO(n*log(N))
Zusammenfassung zusätzliche Zeit.quelle
Nachher erstellte Indizes sind in den meisten Fällen viel schneller. Ein typisches Beispiel: 20 Millionen Zeilen mit Volltext auf varchar (255) - (Business Name) Index beim Importieren von Zeilen - eine Übereinstimmung, die im schlimmsten Fall bis zu 20 Sekunden dauert. Index löschen und neu erstellen - jedes Mal weniger als 1 Sekunde dauern
quelle
Ich bin mir nicht sicher, ob es aus Gründen der Indexeffizienz wirklich wichtig ist, da Sie in beiden Fällen neue Daten in den Index einfügen. Der Server würde im Grunde genommen erst nach seiner Erstellung wissen, wie unausgeglichen ein Index sein würde. In Bezug auf die Geschwindigkeit werden die Einfügungen natürlich ohne Index ausgeführt.
quelle