Posts

Posts mit dem Label "SQL" werden angezeigt.

alter table move mit Filter - Altdaten entsorgen und gleich reorganisieren

Fazit: Da ALTER TABLE MOVE auch die Filterung von Daten zulässt, kann damit sehr elegant: aufgeräumt und reorganisiert werden. Zitat: "Denn das ALTER TABLE MOVE beinhaltet eine  Filter Condition , die eine WHERE-Klausel verwendet, um die zu übertragenden Daten zu filtern. Man führt also das Purging der Altdaten und die Reorganisation in einem Schritt durch." Der vollständige Text findet sich hier: DOAG Datenbank Kolumne: Altdaten entsorgen und gleich reorganisieren: DOAG e.V.

Statistiken entsperren / ORA-20005: object statistics are locked (stattype = ALL)

Aktueller Fall: Nach dem Import eines Schemas aus einer anderen Datenbank (per DataPump) waren alle Tabellen und Daten wie gewünscht vorhanden. Die Statistiken wurden vom alten System übernommen. Dies ist grundsätzlich auch sinnvoll, da die Daten ja unverändert übernommen wurden. Hier waren aber "frische" Statistiken gewünscht. Problem: Es wurden keine neuen Statistiken erstellt. Die Prüfung hat ergeben, dass die übernommenen Statistiken gelocked waren ( stattype_locked = 'All' ). Eine einfache Neuerstellung meldete: ORA-20005: object statistics are locked (stattype = ALL) . Nach dem Entsperren mit dbms_stats.unlock_schema_stats lief die Neuerstellung problemlos durch. Hier der Code dazu: -- Prüfen, ob Statistiken gelocked sind (= stattype_locked nicht leer) select table_name, stattype_locked from user_tab_statistics; -- Statistiken ggfs. entsperren exec dbms_stats.unlock_schema_stats('abc'); ...

How to Read an Execution Plan

Eine kurze Einführung von Chris Saxon zu Execution Plans: https://blogs.oracle.com/connect/post/how-to-read-an-execution-plan

SQL: (Outer-)Join von VALID FROM VALID TO / AB BIS Tabellen / Zeitraumangaben / multi-temporalen Angaben

Beim JOIN von Tabellen mit AB- und BIS-Gültigkeitsangaben ist wichtig zu beachten, dass im Ergebnis des JOIN ggfs. zusätzliche Zeilen "entstehen", da sich die zusammengeführten Zeiträume möglicherweise "aufsplitten". Ein Beispiel: Die ID 1 und 2 haben als Kennzeichen A vom 01.01.2021 bis 14.01.2021 ein "D". Ab 15.01. wechsel das Kennzeichen auf "E". Das Kennzeichen B der ID 1 wechselt am 15.02.2021 von "K" auf "L". ID 2 hat KEIN Kennzeichen B. -- Left-Outer Join - korrekt select F1.ID      , F1.KNZ_A      , F2.KNZ_B      , GREATEST (F1.AB, nvl (F2.AB, F1.AB)) AB      , LEAST (F1.BIS, nvl (F2.BIS, F1.BIS)) BIS      , F1.AB F1_AB      , F1.BIS F1_BIS      , F2.AB F2_AB      , F2.BIS F2_BIS   from FS_AB_BIS1 F1   left join FS_AB_BIS2 F2         on F1....

SQL: Korrekter Join von VALID FROM TO / AB BIS Tabellen / Zeitraumangaben / multi-temporalen Angaben

Beim JOIN von Tabellen mit AB- und BIS-Gültigkeitsangaben ist wichtig zu beachten, dass im Ergebnis des JOIN ggfs. zusätzliche Zeilen "entstehen", da sich die zusammengeführten Zeiträume möglicherweise "aufsplitten". Ein Beispiel: Die ID 1 hat als Kennzeichen A vom 01.01.2021 bis 14.01.2021 ein "A". Ab 15.01. wechsel das Kennzeichen auf "B". Das Kennzeichen B dieser ID wechselt am 15.02.2021 von "K" auf "L". In getrennten Tabellen abgelegt schaut das dann so aus: select * from FS_AB_BIS1 ;         ID KNZ_A AB        BIS      ---------- ----- -------- --------          1 A      01.01.21 14.01.21          1 B      15.01.21 31.12.99 2 rows selected.     select * from FS_AB_BIS2 ;         ID KNZ_B AB     ...