Frage

Im Moment der Prozess, dass wir zum Einfügen von Gruppen von Datensätzen verwenden ist so etwas wie folgt aus:

(und beachten Sie, dass „Satz von Datensatz“ bedeutet so etwas wie ein Datensatz einer Person zusammen mit ihren Adressen, Telefonnummern oder anderen verknüpften Tabellen).

  1. Starten Sie eine Transaktion.
  2. Legen Sie eine Gruppe von Datensätzen, die in Zusammenhang stehen.
  3. Commit, wenn alles erfolgreich war, rollen wieder anders.
  4. Gehen Sie zurück zu Schritt 1 für den nächsten Satz von Datensätzen.

sollten wir etwas mehr wie dies tun?

  1. Starten Sie eine Transaktion zu Beginn des Skripts
  2. Starten Sie einen Speicherpunkt für jeden Satz von Datensätzen.
  3. Legen Sie eine Reihe von Bezugsdatensätzen.
  4. Rollen zurück zum Speicherpunkt, wenn ein Fehler ist, weitergehen, wenn alles erfolgreich ist.
  5. Commit die Transaktion zu Beginn des Skripts.

Nachdem einige Probleme mit ORA-01555 mit und liest ein paar Informieren Sie sich Tom Artikel (wie dieses ), ich denke an den zweiten Prozess auszuprobieren. Natürlich, wie Tom betont, ist eine neue Transaktion beginnt etwas, das von Geschäftsanforderungen definiert werden soll. Ist der zweite Prozess einen Versuch wert, oder ist es eine schlechte Idee?

War es hilfreich?

Lösung

Eine Transaktion sollte eine sinnvolle Einheit der Arbeit sein. Aber was eine Einheit der Arbeit hängt von Kontext. In einem OLTP-System eine Arbeitseinheit eine einzelne Person, zusammen mit ihren Adressinformationen sein würde, etc. Aber es klingt, als ob Sie irgendeine Form von Stapelverarbeitung implementieren, die Lade vielen Personen ist.

Wenn Sie Probleme mit ORA-1555 haben, ist es fast sicher, weil Sie sind eine lange Laufabfragedaten liefern, die von anderen Transaktionen aktualisiert wird. Begehen in Ihrer Schleife trägt zur zyklischen Verwendung von UNDO-Segmenten, und neigen dazu, so wird die Wahrscheinlichkeit zu erhöhen, dass die Segmente Sie setzen Lesekonsistenz bieten werden wiederverwendet wurden. Also, nicht das zu tun ist wahrscheinlich eine gute Idee.

Ob mit Savepoints die Lösung ist eine andere Sache. Ich bin mir nicht sicher, was Vorteil, dass Sie in Ihrer Situation geben würde. Wie Sie mit Oracle 10g arbeiten vielleicht sollten Sie erwägen, bulk mit DML Fehlerprotokollierung statt.

Alternativ können Sie wollen die treibende Abfrage neu zu schreiben, so dass es mit kleineren Datenmengen arbeitet. Ohne zu wissen, mehr über die Einzelheiten des Prozesses kann ich nicht spezifische Ratschläge geben. Aber im Allgemeinen, statt einen Cursors für 10000 Datensätze öffnen könnte es besser sein, es zu öffnen zwanzigmal für 500 Zeilen eines Pop. Die andere Sache zu prüfen ist, ob der Einführungsprozess effizienter gemacht werden kann, etwa durch Bulk-Sammlung und FORALL- verwenden.

Andere Tipps

Einige Gedanken ...

  1. Es scheint mir einer der Punkte des AskTom Link zu Größe war Ihr Rollback / Undo in geeigneter Weise die 1555 die zu vermeiden. Gibt es einen Grund, warum dies nicht möglich ist? Er weist darauf hin, dann ist es viel billiges Platte zu kaufen, als es zu schreiben ist / code immer um Rollback-Einschränkungen zu umgehen halten (obwohl ich nach dem Lesen des $ 250 pricetag für ein 36GB-Laufwerk eines Doppeltnehmen zu tun hatte - dieser Thread gestartet im Jahr 2002 Gute Darstellung von Moores Gesetz!)
  2. Dieser Link (Burleson) zeigt ein mögliches Problem mit Sicherungspunkten.
  3. Ist Ihre Transaktion in Wirklichkeit Schritten 2,3 und 5 im zweiten Szenario? Wenn ja, das ist, was ich tun würde - jede Transaktion begehen. Klingt ein bisschen für mich wie Szenario 1 ist eine Sammlung von Transaktionen in einer Person?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top