Stew Ashton ist derzeit für einen signifikanten Anteil der ungelesen in meinem Blog-Reader wartenden Artikel verantwortlich, da er gerade eine vielteilige Serie zum Thema "Chunking tables" veröffentlicht hat (veranlasst durch eine entsprechende OTN-Anfrage von Jonathan Lewis bzw. White paper Bezugnahme von Bryn Llewellyn). Die genaue Anzahl der Artikel lasse ich aus, um diese Einleitung generisch zu halten und spätere Korrekturen der Anzahl vermeiden zu können. Freundlicherweise pflegt der Autor im ersten Artikel eine Liste der veröffentlichten Artikel, so dass ich mir das an dieser Stelle sparen kann. Hier folgt jetzt eine ganz und gar subjektive und hoffnungslos unvollständige Liste von Punkten, die mir daraus erinnerungswürdig erscheinen - und der übliche Hinweis, dass eine vollständige Lektüre der Artikel weitaus lohnender wäre als die Durchsicht meiner Kommentare:
- Chunking tables 1: Genesis
- erläutert das Thema und liefert die Liste der Links zu den Artikeln (und ist oben verlinkt).
- Chunking tables 2: Requirement
- grundsätzlich geht es in den Artikeln darum, eine Tabelle in gleichgroße Bereiche zu zerlegen.
- interessant kann das sein, wenn man für große batch DML-Operationen einen do-it-yourself-parallelism verwenden will und "echte" Parallelisierung einen zu großen Overhead hervorruft, nicht gut funktioniert (etwa wenn db links im Spiel sind) oder einfach zu teuer ist.
- unter Umständen kann man dabei auf mit intermediate commits arbeiten (um parallele OLTP Transaktionen nicht zu lange zu blockieren), wobei allerdings sicherzustellen ist, dass die Operation nach einem Fehler auf den verbleibenden Daten neu aufsetzen kann.
- seit 11.2 wird die Strategie der intermediate commits durch das Package dbms_parallel_execute unterstützt.
- mit dbms_parallel_execute kann man eine feste Größe der Chunks definieren, nicht aber eine bestimmte Anzahl.
- Chunking tables 3: working with blocks
- erklärt, wie man die rowid mit Hilfe von dbms_rowid in die Block-Adresse umwandeln kann.
- Chunking tables 4: Histograms
- zeigt, wie man die Basisdaten aus dba_extents mit SQL-Mitteln in 12 gleichgroße Chunks mit Minimal- und Maximalwerten zerlegen kann (also Histogramme). Dabei kommen die Funktion WIDTH_BUCKET und das analytische SUM zum Einsatz - und ein paar Subqueries in CTEs. Der Herr Ashton hat sein SQL immer gut im Griff.
- eine Filterung irrelevanter Zwischenergebnisse, die ein Sonderlob von Jonathan Lewis erhalten hat, macht die Query für Tabellen mit sehr vielen Extents effizienter.
- Chunking tables 5: chunk boundaries
- die im vorangehenden Artikel erzeugten Chunks enthalten die Extents, aber noch nicht die exakten Block-Begrenzungen, die in diesem Artikel mit Hilfe relativ simpler Arithmetik bestimmt werden ("he right answer is to subtract 1 from the maximum value and then use CEIL()").
- Chunking tables 6: JOIN solution
- erläutert mit umfassenden Kommentaren, wie man die in den bisherigen Artikeln aufgeführten Informationen in einer einzigen großen (und recht komplexen) Query zusammenfasst. Die Details spare ich mir: die würde ich beim Einsatz eines solchen Vorgehens ohnehin wieder im Original nachlesen müssen - ach was: vermutlich würde ich die Lösung einfach kopieren und mit meinen Objektnamen anpassen...
- Chunking tables 7: prior sys_guid() ???
- erklärt die Grundalge einer zweite Lösung ohne Join, die eine rekursive Query und die sys_guid-Funktion verwendet - und noch mal deutlich erklärungsbedürftiger ist als der Join aus Teil 6. In 12c kann man dieses Vorgehen mit der LATERAL clause noch deutlich vereinfachen.
- Chunking tables 8: second solution
- liefert die komplette zweite Lösung mit der in Artikel Nr. 7 erläuterten Vorgehensweise.
Mag sein, dass der Herr Ashton noch weitere Artikel zum Thema ergänzt. Und mag sein, dass ich das hier dann auch tun werde. Wobei der wichtigste Punkt, den ich mir merken muss, ist, dass die Vorgehensweise hier erläutert ist und ich mir die passende ggf. ausborgen könnte.