Gibt es eine Möglichkeit zu tun, eine INSERT INTO SELECT-Anweisung unter Angabe einer commit-Zähler?
DB: Oracle 11g
Gibt es eine Möglichkeit, etwas zu tun, wie die folgenden:
INSERT INTO T1
(V1, V2)
COMMIT EVERY X
AS
SELECT (V1, V2) FROM T2;
Ich weiß wie eine Schleife durch den cursor, aber ich bin auf der Suche nach etwas mehr gestrafft.
PL/SQL ist in Ordnung, aber keine Schleifen.
Mithilfe einer SQL-Tipp ist auch gut.
Wenn das nur etwas, dass oracle nicht umgehen kann, der Traurigkeit ergibt sich (Meistens bin ich nur neugierig, da habe ich einen anderen Ansatz bereits funktioniert).
HINWEIS: Die Anwendung enthält Hunderte von Milliarden von Datensätzen. Millionen sind erstellt pro Tag. INSERT INTO SELECT funktioniert nicht, die auf solchen großen Datensätzen. Vor allem, wenn es gleich große Gruppen parallel laufen.
- Wie Sie sehen können aus den Antworten, es ist allgemein Konsens, nicht über dazwischenliegende commits, die ich Stimme mit. Ich bin neugierig, aber, warum Sie wollen, um ein Zwischenprodukt zu Begehen? Was ist das?
- Können Sie erklären, was "funktioniert nicht"? Es ist relativ Häufig in data warehouses zu tun, die große Zahl von
INSERT ... SELECT
Aussagen in verschiedenen Sitzungen während gleichzeitig lädt. - In der Antwort auf die Frage, warum ich das wollen: Die Anwendung hat Hunderte von Milliarden von Datensätzen. Millionen pro Tag an Daten. INSERT INTO SELECT funktioniert nicht, die auf solchen großen Datensätzen. Vor allem, wenn es gleich große Gruppen parallel laufen. Auch Cursor und FORALL sind sperrig und hässlich. Aber meistens bin ich einfach nur neugierig.
- Hinweis: Es werden extrem große Mengen von Daten. Nicht eine große Anzahl von kleinen Mengen von Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oracle nicht erlaubt, eine Erklärung zu haben interim verpflichtet sich, keine. Würde dies ein Verstoß gegen die grundlegenden Eigenschaften einer SÄURE Datenbank. Was passiert, wenn die Anweisung in Zeile N? Oracle wäre nicht in der Lage sein, ein Rollback der zuvor begangen Zeilen. Es würde nicht wissen, welche Zeilen hatte bearbeitet wurden und welche noch nicht bearbeitet wurde. Also deine Aussage wäre teilweise erfolgreich und Ihre Datenbank werden Links in einem unbekannten Zustand. Einer der wichtigsten Vorteile der Verwendung einer relationalen Datenbank ist zu vermeiden, dass genau dieses Ergebnis.
Warum willst du eine einstweilige Begehen in den ersten Platz? Das wird Ihr code langsamer und dazu führen, dass Sie mehr Ressourcen. Es wird Sie zwingen, schreiben Sie eine Reihe von code, um Ihren Prozess neu gestartet (D. H. Sie müssten, um zu verfolgen, welche Zeilen hatte bearbeitet wurden und welche noch nicht, so dass man entweder ein Rollback teilweise umfassende änderungen oder starten Sie den Prozess, wenn es nicht in der Mitte). Und es geht um Ihren code viel schwerer zu testen. Es ist fast nie ein guter Grund, einen interim Begehen.
Oracle keine solche SQL-Konstrukt. Verwenden von PL/SQL mit einem cursor und die FORALL-Anweisung kann es für Sie tun ... ABER:
Es ist gut, dass Oracle keine solche Traurigkeit. Oracle ist ein RDBMS, das baut auf der ACID-Prinzipien. Das I steht für die isolation, die in Oracle, standardmäßig auf READ COMMITTED. Was bedeutet, dass andere gleichzeitige Transaktionen nicht sehen können, Ihre Transaktion auf halbem Weg durch. Es verhindert, dass andere Sitzungen sehen inkonsistente Daten. Einer der Eckpfeiler der Verwendung eines RDBMS.
Das bringt uns zu der wichtigsten Frage hier: Warum würden Sie jemals wollen, ein solches Konstrukt?
Ich hoffe, es ist nicht Angst vor dem "großen" Transaktionen.
Ich habe nicht überprüfen, aber vielleicht mit
bulk inserts
dies können Sie erreichen:Aber als Justin Höhle, Warum ???