Sollte ich den Index nach dem Abschneiden / großen Einfügen neu erstellen?

10

Ich habe eine gespeicherte Prozedur, die einige Tabellen mit jeweils etwa 1,75 Millionen Zeilen abschneidet, bevor neue Daten eingefügt werden (basierend auf Daten in anderen Tabellen, Berechnungen usw.).

Grundriss ist sehr einfach:

  • Tabellen abschneiden
  • Fügen Sie 1,75 Millionen Zeilen in "Stapel" von ungefähr 75.000 pro Zeit ein.

Ich frage mich, ob ich die Indizes in diesem Prozess zu irgendeinem Zeitpunkt explizit neu erstellen soll. z.B

  • Tabellen abschneiden
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [oder etwas ähnliches]
  • Fügen Sie 1,75 Millionen Zeilen ein

oder vielleicht

  • ALTER INDEX ALL ON xxx DISABLE
  • Tabellen abschneiden
  • Fügen Sie 1,75 Millionen Zeilen ein
  • ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [oder etwas ähnliches]

Jede Hilfe wird geschätzt ... kein DBA - ein Entwickler, der die DBs ziemlich gut kennt, ist genauer!

BlueChippy
quelle
Weitere Informationen zur Tabellenstruktur, zu den heute vorhandenen Indizes und zum Aussehen der eingefügten Daten (in einer bestimmten Reihenfolge? Stimmt das mit dem Clustered-Index überein?) Würden helfen. Ich gehe auch davon aus, dass diese Tabelle nicht verfügbar ist, bis dieser Vorgang abgeschlossen ist. Das ist gut zu wissen, um Optionen für den Massenimport zu haben.
Mike Walsh
Vielleicht sollten Sie die Tabelleneinfügung abschneiden und einen Blick auf Ihre Indexfragmentierung werfen, um festzustellen, ob dies erforderlich ist oder nicht.
Zane
v: Standard 2008. Quelldaten sind mehrere Staging-Tabellen, bevor diese Daten von CSV-, Excel-, Oracle- und anderen SQL-Datenbanken geladen werden. Die Tabellenstrukturen sind zu diesem Zeitpunkt alle identisch: 6 Zeichen-ID, 3 Zeichen-Code, 10 Dezimalstellen (20,5). Primärschlüssel ist ID + Code. Daten werden durchgeladen insert intound im Moment gibt es keine order byKlausel, aber ich könnte das hinzufügen, wenn es helfen würde? ID und Code werden ebenfalls separat indiziert.
BlueChippy

Antworten:

6

Wie bei den meisten Fragen dieser Art kommt es darauf an. Es ist unwahrscheinlich, dass Sie die Daten in der "richtigen" Reihenfolge für alle beteiligten Indizes einfügen. Dies bedeutet, dass bei all diesen Indizes während des Einfügevorgangs wahrscheinlich viele Seiten aufgeteilt werden. Nehmen wir also an, Sie fügen in gruppierter Indexreihenfolge ein. Sie können alle nicht gruppierten Indizes deaktivieren, abschneiden, einfügen und dann alle nicht gruppierten Indizes neu erstellen. Wenn Sie beide Ansätze ausprobieren, erfahren Sie natürlich, welche Wahrheit unabhängig von der dahinter stehenden Theorie schneller ist. :) :)

Ben Thul
quelle
1

Plan Basic mit allen aktivierten Indizes ist möglicherweise langsam und führt zu einer Fragmentierung.

ALTER INDEX REBUILD für eine abgeschnittene und daher leere Tabelle hat keinen Zweck, daher müssen Sie Ihren Plan A ändern. Es sollte sein:

  • KÜRZEN
  • Einfügen
  • ALTER INDEX REBUILD

Es mag immer noch langsam sein, aber zumindest erhalten Sie scharfe Indizes.

Plan B ist in Ordnung. Testen Sie alle drei und finden Sie heraus, welche am schnellsten ist und welche die geringste Indexfragmentierung ergibt. Dann entscheiden Sie, ob sich der Wiederaufbau lohnt.

Orbilin
quelle