Der Unterschied besteht darin, dass beim Sammeln von Statistiken die Metadaten über den aktuellen Index aktualisiert werden, während das Löschen und erneute Erstellen des Index, äh, das Löschen und erneute Erstellen des Index bedeutet.
Vielleicht ist es einfach, den Unterschied mit einem ausgearbeiteten Beispiel zu verstehen. Lassen Sie uns also eine Tabelle und einen Index erstellen:
SQL> create table t23
2 as select object_id as id, object_name as name from user_objects
3 /
Table created.
SQL> create index i23 on t23(id)
2 /
Index created.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116353 23-NOV-2013 00:15:39 23-NOV-2013 00:15:39 167
1 row selected.
SQL>
Seit 11g sammelt Oracle automatisch Statistiken, wenn wir einen Index erstellen. Die Indexerstellung und die letzte Analyse zeigen also dieselbe Datumszeit. In früheren Versionen mussten wir explizit Statistiken sammeln, nachdem wir den Index erstellt hatten. Weitere Informationen .
Als Nächstes fügen wir einige Daten hinzu und aktualisieren die Statistiken:
SQL> insert into t23 values (9999, 'TEST1')
2 /
1 row created.
SQL> insert into t23 values (-8888, 'TEST 2')
2 /
1 row created.
SQL> exec dbms_stats.gather_index_stats(user, 'I23')
PL/SQL procedure successfully completed.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116353 23-NOV-2013 00:15:39 23-NOV-2013 00:26:28 169
1 row selected.
SQL>
Jetzt haben sich die Metadaten zu Statistiken geändert, aber der Index ist dasselbe Datenbankobjekt. Wenn wir hingegen den Index löschen und neu erstellen, erhalten wir ein neues Datenbankobjekt:
SQL> drop index i23
2 /
Index dropped.
SQL> create index i23 on t23(id)
2 /
Index created.
SQL> select o.object_id, i.last_analyzed, i.distinct_keys
2 from user_objects o
3 join user_indexes i
4 on (i.index_name = o.object_name)
5 where o.object_type = 'INDEX'
6 and i.index_name = 'I23'
7 /
OBJECT_ID CREATED LAST_ANALYZED DISTINCT_KEYS
---------- -------------------- -------------------- -------------
116354 23-NOV-2013 00:27:50 23-NOV-2013 00:27:50 169
1 row selected.
SQL>
Im normalen Betrieb müssen wir fast nie einen Index löschen und neu erstellen. Es ist eine Technik, die manchmal beim Laden sehr großer Datenmengen und in sehr seltenen Fällen von Indexbeschädigungen geeignet ist. Die Interwebs werfen immer noch Websites auf, die aus Leistungsgründen eine regelmäßige Neuerstellung von Indizes empfehlen (angeblich werden verzerrte Indizes "neu ausgeglichen"), aber diese Websites erstellen keine Benchmarks, um die langfristigen Vorteile zu beweisen, und enthalten sicherlich nie die Zeit und Durch die Wiederherstellungsübung verschwendete CPU-Zyklen.
Das Neuerstellen eines Index erfordert mehr Arbeit als das Aktualisieren der Statistiken. Offensichtlich wahr, denn der Wiederaufbau beinhaltet das Sammeln von Statistiken als Teilaufgabe. Die Frage ist, ob es effizienter ist, Massen-DML für eine Tabelle mit vorhandenen Indizes durchzuführen, als die Indizes zu löschen und anschließend neu zu erstellen. Es kann schneller sein, Daten ohne Indizes in eine Tabelle zu laden und sie anschließend neu zu erstellen.
Hier gibt es keine feste Regel:Es hängt davon ab, wie viele Indizes Sie haben, wie hoch der Anteil der betroffenen Zeilen an der Gesamtgröße der Tabelle ist, ob Sie die Indizes benötigen, um relationale Integritätsbedingungen durchzusetzen, und so weiter. Es gibt auch einen großen Unterschied zwischen den Operationen:Möglicherweise möchten Sie Indizes für Masseneinfügungen löschen, aber für Aktualisierungen beibehalten, je nachdem, welche Indizes Sie für Ihre WHERE-Klausel benötigen und ob die Aktualisierung indizierte Spalten betrifft.
Kurz gesagt, Sie müssen Ihr eigenes spezifisches Szenario bewerten. Dies ist oft die Antwort, wenn es um Leistungsfragen geht.