webentwicklung-frage-antwort-db.com.de

Der beste Weg, um eine Spalte mit einem Standardwert unter Last hinzuzufügen

Beim Hinzufügen einer Spalte zu einer Tabelle mit einem Standardwert und einer Einschränkung ungleich Null. Ist es besser, eine einzelne Anweisung auszuführen oder diese in Schritte aufzuteilen während die Datenbank geladen ist.

ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL

VERSUS

ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
22
Ben George

Die Leistung hängt von der von Ihnen verwendeten Oracle-Version ab. Sperren werden trotzdem generiert.

Wenn Version <= Oracle 11.1, verhält sich # 1 wie # 2. Es ist sowieso langsam. Beginnend mit Oracle 11.2 hat Oracle eine großartige Optimierung für die erste Anweisung eingeführt (ein Befehl erledigt alles). Sie müssen den Befehl nicht ändern - Oracle verhält sich einfach anders. Der Standardwert wird nur im Datenwörterbuch gespeichert, anstatt jede physische Zeile zu aktualisieren.

Aber ich muss auch sagen, dass ich in der Vergangenheit einige Fehler im Zusammenhang mit dieser Funktion entdeckt habe (in Oracle 11.2.0.1).

  • fehler beim traditionellen Import, wenn der Export mit direct = Y ausgeführt wurde
  • merge-Anweisung kann einen ORA-600 [13013] auslösen (interner Oracle-Fehler)
  • ein Leistungsproblem bei Abfragen mit solchen Tabellen

Ich denke, diese Probleme wurden in der aktuellen Version 11.2.0.3 behoben, daher kann ich die Verwendung dieser Funktion empfehlen.

18
Roman Krüger

Vor einiger Zeit haben wir mögliche Lösungen für das gleiche Problem evaluiert. In unserem Projekt mussten wir alle Indizes in der Tabelle entfernen, Änderungen vornehmen und die Indizes wiederherstellen.

0
Dewfy

Wenn Ihr System die Tabelle verwenden muss, ist DBMS_Redefinition wirklich Ihre einzige Wahl.

0
David Aldridge