Oracle Data Warehouse – Datenbank basierte ETL-Prozesse
DATA WAREHOUSE
Themenübersicht 1/2
• Anforderungen an den ETL-Prozess im Data Warehouse
• Speichermanagement und Grundlagentechniken• Blöcke, Extents, Segmente, Tablespace• Direct Path Load, Mengenbasiertes Laden• Logging / NoLogging• Partition Exchange and Load (PEL)
• Zugriff auf Quellsystemen• Umgang mit Deltadaten• Kopiertechniken / SQL Loader / Data Pump / External Tables
/ Transportable Tablespace
Datenbank-basierte ETL-Prozesse
2
Themenübersicht 2/2
• Planung und Organisation des ETL Prozesses• Schichten als Planungsgrundlage• Umgang mit separaten ETL-Tools und Lade-Engines• Prüftechniken mit SQL• Szenario zum Prüfen von Daten
• Weitere Datenbank-Techniken• Ersatz von Aggregat-Tabellen durch MAVs• Table Functions• Pivoting• Multiple Inserts / Merge
• Zusammenfassung
Datenbank-basierte ETL-Prozesse
3
Themenübersicht 1/2
• Anforderungen an den ETL-Prozess im Data Warehouse
• Speichermanagement und Grundlagentechniken• Blöcke, Extents, Segmente, Tablespace• Direct Path Load, Mengenbasiertes Laden• Logging / NoLogging• Partition Exchange and Load (PEL)
• Zugriff auf Quellsystemen• Umgang mit Deltadaten• Kopiertechniken / SQL Loader / Data Pump / External Tables
/ Transportable Tablespace
Datenbank-basierte ETL-Prozesse
4
Das große Klagen
• Lieferzeiten der Daten zu lange (Latenzen)• Zu schwerfällig bei Änderungen • Informationen mehrfach vorhanden• Fehlende unternehmensweite Sichten• Nicht die richtigen Informationen für die Anwender• Anwender haben zu wenig unmittelbaren
Einfluss auf die Daten
• Immer teuerer • Maintenance-Aufwand zu hoch / Personal• Explodierende Datenmengen -> Storage- / Ladezeitenthematik
System-Nutzen
Maintenance Technik
R R
BS S
S
D
D
DD
Enterprise Information Layer User View LayerData Integration Layer
T
T
T
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
B
F
F
F
D
D
D
DB
B
B
B
Zu
samm
enh
äng
end
er A
bfrag
ebe
reich
Flexibilität und schnelles Bereitsstellen
6
Strategische Daten
TaktischeDaten
inte
gri
eren
aufb
ereiten
OperativeDaten
Lade-Aktivitäten an Schichtübergängen
Integration Enterprise User ViewFlüchtige Daten Persistent Kopien / teilpersistent
dynamisch
KopierenSelektieren
Generische Datenstrukturen(isolierte Tabellen,teil-ausgeprägte Datentypen)
Keine Constraints
3 NF Datenstrukturen(ER-Tabellen,ausgeprägte Datentypen)
Aktivierte Constraints
Multidimensionale Modelle(ER-Tabellen,ausgeprägte Datentypen)
MengenbasiertesPrüfen ohne Constraints
UmschlüsselungLookups -> Referenz-/StammdatenJoinsAufbauen von Distinct-Strukturen(Normalisieren)
UmschlüsselungLookups -> DimensionsdatenJoins - Denormalisieren
Normalisieren(Granularisieren)
7
DenormalisierenHistorisieren
z.T. Aggregieren
Clearing-Verfahren,technisches, logisches,semantisches Prüfen
Hilfsmittel in der Datenbank (Auflistung)
• Parallelisierung• Partitioning / Partition Exchange Load (PEL)• Direct Path Load• Set-Based SQL• Pipelined Table Functions• Materialized Views• External Tables / Loader• Transportable Tablespace• Data Pump• Database Link• Direkt FTP-Load
1. Integrieren
• Identifizieren von identischen oder zusammenhängenden Informationen• Synonymen-/Homonymen-Thematik
• Aggregationslevel angleichen• Identifizieren und Angleichen
• Formate, Zustände, Sichtweisen etc...
1. Integrieren2. Informations-Mehrwerte 3. Kopieren4. Sammeln
Betrag / SummeArtikel / Produkt
Artikel / Artikelgruppe
Meter / KilometerLose Stücke / Gebinde
10
2. Informations-Mehrwerte
• Qualitativ gute Informationen schaffen• Datenqualitäts-Checks
• Vollständigkeit• Datentypen• Referentielle Integrität• Eindeutigkeit• Korrekte Werte
• Fachliche Regeln überprüfen
• Berechnungen / Aggregationen / Zusammenfassungen• Anreichern und Vermengen mit Referenzdaten
• Lookups• Marktdaten• Vergleichszahlen
1. Integrieren2. Informations-Mehrwerte 3. Kopieren4. Sammeln
11
3. Kopieren
• 1:1-Datenbewegung• Einfachste Aufgabe
• Mengen-Operationen• Ohne zusätzliche Logik
• Überwindung von Systemgrenzen• Vorschriften zum Mapping• Schnittstellen-Konventionen
• Aspekt der Performance
1. Integrieren2. Informations-Mehrwerte 3. Kopieren4. Sammeln
12
4. Sammeln
• Einlagern von Daten• Zeitliche Rahmenvorgaben• Historisierung
• Versionieren von Daten• Kategorisieren / Inventarisieren von Daten
• Dokumentieren der eingelagerten Informationen
• Referenzen aufbauen • Alterungs-Eigenschaften berücksichtigen • Dokumentieren• Mehr als nur eine Momentaufnahme
1. Integrieren2. Informations-Mehrwerte 3. Kopieren4. Sammeln
13
Daten-nahe Transformation im DWHDen richtigen Platz finden
n-tier
Application Server
n-tier
Application Server
Quellsystem DWH-System
ETL?
ETL?
14
Themenübersicht 1/2
• Anforderungen an den ETL-Prozess im Data Warehouse
• Speichermanagement und Grundlagentechniken• Blöcke, Extents, Segmente, Tablespace• Direct Path Load, Mengenbasiertes Laden• Logging / NoLogging• Partition Exchange and Load (PEL)
• Zugriff auf Quellsystemen• Umgang mit Deltadaten• Kopiertechniken / SQL Loader / Data Pump / External Tables
/ Transportable Tablespace
Datenbank-basierte ETL-Prozesse
15
Zuordnung Datenobjekten und Speicher
Table
Index
Mview
Partition
DB-Objekte
Speicherobjekte
Die automatische Extent-Vergrößerung
• Automatische Allokierung von weiteren Segmenten• Exponentielles Vergrößerungs-Mass
TABLE_NAME BLOCKS EMPTY_BLOCKS AVG_ROW_LEN NUM_ROWS PCT_FREE COMPRESS EXTENTS SEG_BYTES EXT_BLKS EXT_BYTES----------------- ------------ ----------- -------- -------- -------- ------- ---------- -------- ---------F_UMSATZ 277772 0 34 51200000 10 DISABLED 217 2281701376 8 65536F_UMSATZ 277772 0 34 51200000 10 DISABLED 217 2281701376 128 1048576F_UMSATZ 277772 0 34 51200000 10 DISABLED 217 2281701376 1024 8388608F_UMSATZ 277772 0 34 51200000 10 DISABLED 217 2281701376 8192 67108864
select t.TABLE_NAME, t.blocks,t.EMPTY_BLOCKS,t.AVG_SPACE,t.AVG_ROW_LEN,t.NUM_ROWS,t.pct_free, t.compression,s.EXTENTS,s.bytes seg_bytes,e.blocks ext_blks,e.bytes ext_bytes
from user_segments s, user_tables t, user_extents e
where t.TABLE_NAME = s.segment_nameand e.SEGMENT_NAME = s.SEGMENT_NAMEand t.TABLE_NAME = 'F_UMSATZ';
Block- und Satzstruktur
Datenbank Block
Row header
Column length
Column value
High Water Mark
Free spaceafter delete
Unused block
Extent ID 0 1 2 3 4
Extent ID 0 1 2 3 4
Used block
Nach INSERTS:
High-water mark
Seg
men
tS
egm
ent
Nach DELETES:
Seg
men
t
Wie wird die „High Water Mark“ bestimmt
Extent ID 0 1 2 3 4
High-water markLAST_USED_EXTENT_FILE_ID, LAST_USED_EXTENT_BLOCK_ID
TOTAL_BLOCKS
UNUSED_BLOCKS
Seg
men
t
Seg
men
tDeallocate Space
Free spaceafter delete
Unused block
Beforedeallocation
Used block
Afterdeallocation
High-water mark
Extent ID 43210
43210Extent ID
ALTER TABLE tablename
DEALLOCATE UNUSED;
Seg
men
t
Truncate Table
High-water mark Free space
Extent ID 0 1
TRUNCATE TABLE tablename
Themenübersicht 1/2
• Anforderungen an den ETL-Prozess im Data Warehouse
• Speichermanagement und Grundlagentechniken• Blöcke, Extents, Segmente, Tablespace• Direct Path Load, Mengenbasiertes Laden• Logging / NoLogging• Partition Exchange and Load (PEL)
• Zugriff auf Quellsystemen• Umgang mit Deltadaten• Kopiertechniken / SQL Loader / Data Pump / External Tables
/ Transportable Tablespace
Datenbank-basierte ETL-Prozesse
24
Seg
men
t
Direct Path Load
Free space after delete Blocks used by inserted rows
High-water markUsed block
F_UMSATZ
INSERT /*+APPEND */ INTO DWH.F_UMSATZ
NOLOGGING
SELECT * FROM OLTP.BESTELLUNGEN;
Serverprocess
Seg
men
t
Paralleler Direct Path Load
Free space after delete Temporary segments
High-water markUsed block
F_UMSATZ
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+APPEND PARALLEL(F_UMSATZ,2)
*/ INTO DWH.F_UMSATZ NOLOGGING
SELECT * FROM OLTP.BESTELLUNGEN;
Slaveprocess
Slaveprocess
„Convential“ und „Direct Path“ - Load
Conventional
Directpath
Arrayinsert Extent
management
Datasave
Table
High-water mark
Space used only by conventional load
Instance
SGA Shared pool
Testfall
F_Umsatz
51.100.000Sätze
ARTIKEL_IDKUNDEN_IDZEIT_IDREGION_IDKANAL_IDUMSATZMENGEUMSATZ_GESAMT
F_Umsatz_DP
51.100.000Sätze
ARTIKEL_IDKUNDEN_IDZEIT_IDREGION_IDKANAL_IDUMSATZMENGEUMSATZ_GESAMT
SQL> insert into f_umsatz_DP select * from f_umsatz;51200000 Zeilen erstellt.Abgelaufen: 00:07:57.73
SQL> insert /*+ APPEND */ into f_umsatz_DP select * from f_umsatz;51200000 Zeilen erstellt.Abgelaufen: 00:00:27.24
SQL> insert /*+ APPEND PARALLEL(F_UMSATZ_DP,2) */ into f_umsatz_DP select * from f_umsatz;51200000 Zeilen erstellt.Abgelaufen: 00:00:20.68
Direct Path / Convential Path
Convential Path• Commits• Reuse Free Space in Blöcken• Constraint Checks• Immer Undo Data / Logging• Daten zunächst immer in SGA Buffer• Tabelle für andere Benutzer offen
Direct Path• Data Save• Schreiben oberhalb der High Water Marks • Keine Constraint Checks
• Nur PK, Not Null, Unique Key• Kein Logging• Daten nicht in SGA Buffer• Tabelle gesperrt für andere Benutzer
Convential Path
SQL LoaderExternal TableInsert AppendCTAS
Benutzer
SQL Command Processing
Space Management
Get new extentsAdjust High Water Mark
Find partial blocksFill partial blocks
Buffer Cache
Buffer Cache Management- Manage queues- Manage contention
Read DatabaseBlocks
Write DatabaseBlocks
Direct Path
Database
Or
ac
le
S
er
ve
r
Space Management
• Empfehlung: Locally Managed Tablespace mit ASSM• Prüfung ob MSSM bei Massen-Inserts schneller ist
ASSM
MSSM
Freelists werden gepflegt
Automatische Verwaltung des freien Platzes
Bitmap managed StorageLocally managed Tablespace ohne Freelists
Empfehlungen bzgl. Spacemanagement
• PCTFREE auf 0 setzen• In der Regel sind keine späteren UPDATES nötig• Spart gegenüber dem Default von 10% auch 10% IO und jede
Verarbeitung ist um 10% schneller• Sollten dennoch UPDATES gemacht werden müssen:
• Partitionieren der Tabelle• Die jüngsten Partitionen mit separatem Tablespace definieren und
PCTFREE auf gewünschten Wert setzen• Wenn keine UPDATES mehr zu erwarten sind -> umkopieren auf
eine Partition mit einem Tablespace mit PCTFREE=0
• Blocksize hochsetzen 16K, 32K• Wirkt sich bei Massen-Inserts bei einer gößeren Datenmenge
positiv auf die Performance aus
Klassische PL/SQL Cursor – Verarbeitung(Negativ – Beispiel)
t_Ref_1 (z. B. 10000)
t_ref_2 (z. B. 5000)
t_ref_3 (z. B. 50)
t_ref_4 (z. B. 6000)
t_Quelle_Stage_1 (z. B. 100000)
t_Quelle_Stage_2 (z. B. 5000)
t_ref_5 (z. B. 8000)
t_ref_6 (z. B. 400)
t_ref_7 (z. B. 80)
t_ref_8 (z. B. 12000)
t_ref_9 (z. B. 15000)
select
select
cursor
cursor
select
select
select
select
select
FaktentabelleInsert
select
select
+Diverse Updates und
Inserts auf Protokolltabellen
Für alle Bewegeungs-sätze z. B. 300.000)
Loop(0,1 Sec /Lauf)
8,3 Std*
* Wert aus einer Bank (2003), wäre heute wesentlich weniger
Mengenbasierte Alternative(Performance – Optimierung bis zu Faktor 20 und mehr)
300.000
t_Ref_1
t_Ref_2
t_Ref_3
t_Ref_4
t_Ref_5
Outer Join Temp Table
t_Ref_6
t_Ref_7
t_Ref_8
t_Ref_9
Cursorloop
SatzweisePrüfung
Protokoll
Fakt Table
Das Simulations-Szenario
F0 F1 F2 F3 F4 F5 F6 F7----- --- ---------- ----------------------------------------- --------- ----------------------------------------- --------------------------------- ---28839 74 3 IamPFnAz6qnhWZlqao1AHgaR9gQczm4SSvtJn9lU 27-JAN-11 upOLaDSvWuxmv4pFlZsgtEPqgi43uRgI1uQjF7kV x2AFYV3W2QIcxf5mPzl39MpErCZI7rc1eQMXuMs8 4228840 10 89 ESh7uiu6Hqo6cwqqk9B7D1w9biFR3QjCVDyNWjaq 01-MAY-08 Mcj4QZEVmiG5Qof4eoPwqARLFhlc1xpLmgrAzL5i jvuabLwH44YODTusRR3Huyz7sECCTrLFGZA5QJdD 1228841 4 59 PA2OpnqxTISxHoHsJ5BZrIJArDGhcKCIi1lAzJyj 17-DEC-10 ebU5ogfehM87oO1f8e1VVrFOjJBsZJEUQLcyOls7 GP5zpIb5EzAsPrT9EuL6tdcJ2BVGbFXtch3F4rkO 5828842 79 74 P4q95WqLs9yWOdx6yryAt7zNgO8YeGzqmXTLdHJe 26-NOV-09 eTsS6sZdjeZbRWSnjq2m3ivoACc29dQENlVYjtkK DTTfROusF1hU1LLGHNRXWWGwpFlO47zedJWgEdX5 55........................................................................................................................................................
Name Type-------------------F0 NUMBERF1 NUMBERF2 NUMBERF3 VARCHAR2(50)F4 DATEF5 VARCHAR2(50)F6 VARCHAR2(50)F7 NUMBER
Tabelle T10
Name Type-------------------F0 NUMBERF1 NUMBERF2 NUMBERF3 VARCHAR2(50)F4 DATEF5 VARCHAR2(50)F6 VARCHAR2(50)F7 NUMBER
Tabelle T20
~ 10 Millionen Sätze
Der ungünstigste FallEinzelinserts – Simuliert über Cursor-Prozedur
CREATE OR REPLACE PROCEDURE PR_x ASCURSOR crs_T10 IS SELECT * FROM T10;bstnr number; V_F0 NUMBER; V_F1 NUMBER; V_F2 NUMBER; V_F3 VARCHAR2(50); V_F4 DATE; V_F5 VARCHAR2(50); V_F6 VARCHAR2(50); V_F7 NUMBER; BEGINopen crs_T10;loop FETCH crs_T10 into V_F0 ,V_F1,V_F2,V_F3,V_F4,V_F5,V_F6,V_F7; insert /*+ NOLOGGING */ into T20 values(V_F0,V_F1,V_F2,V_F3,V_F4,V_F5,V_F6,V_F7);
EXIT WHEN crs_T10%NOTFOUND; END loop;END;
Laufzeit: 08:31 (Minuten : Sekunden)
Lese-Operation T10 Tabelle
Datenbewegung über Variablen
Schreibvorgang
Der einfache INSERT
• INSERT in leere Tabelle
• INSERT in gefüllte Tabelle
• INSERT in gefüllte Tabelle (Wiederholung)
Laufzeit: 01:46 (Minuten : Sekunden)
Laufzeit: 01:58 (Minuten : Sekunden)
Laufzeit: 01:58 (Minuten : Sekunden)
insert into t20 select * from t10;
Logging / Nologging
• INSERT im Archivelog-Modus
• INSERT mit NOLOGGING im ARCHIVE-Modus
Laufzeit: 02:56 (Minuten : Sekunden)
Laufzeit: 01:48 (Minuten : Sekunden)
insert into t20 select * from t10;
insert /*+ NOLOGGING */ into t20 select * from t10;
Logging / Nologging
• Wird der Archivelog-Modus benötigt oder nicht?• Relevant für
• Backup• DataGuard / Golden Gate• Flashback
• Wichtigster Punkt ist: BACKUP• Abhängig vom Backup-Konzept
Auswirkungen auf das Backup-Konzept
• Plattensicherung • Oft einfach, weil eingespielte Verfahren• Grosser Ressourcenverbrauch
• Alle (DWH-Bereiche) werden gesichtert -> großer Platzbedarf• Teure Backup-Software
• Nicht immer sicher, weil korrupte Datenbank-Blöcke nicht erkannt werden können
• Man kann ohne Archivlog fahren -> ETL schneller und einfacher
• Sicherung mit RMAN• Ressourcen-günstigstes Verfahren• Man muss mit Archivlog fahren
• ETL etwas langsamer• Massenloads müssen mit NOLOGGING gefahren werden ->
separate Sicherung
R R
B
S S S D
D
DD
Enterprise Information Layer User View LayerData Integration Layer
T
T
T
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
B
F
Keine SicherungInkremental Backup nur für Referenz- und Stammdaten
Keine Sicherung,wenn Data Martskomplett neu aufgebautWerden
große Bewegungsdatentabellenam besten nach Abschluss desETL-Laufes sichern
RMAN- Backup-Verfahren: Was wird gesichert?
41
RMAN(Incremental)
RMAN (Incremental)
Direct Path Load
• Create Table As Select (CTAS
• INSERT mit APPEND - Hint
Laufzeit: 01:00 (Minuten : Sekunden)
Laufzeit: 01:00 (Minuten : Sekunden)
Create Table t20 as select * from t10;
insert /*+ APPEND */ into t20 select * from t10;
Arbeiten mit Buffer-Caches
• Wiederholtes Laden ohne zuvor die Buffer-Caches zu leeren• Der SELECT-Teil läuft schneller
Laufzeit: 01:00 (Minuten : Sekunden)
insert /*+ APPEND */ into t20 select * from t10;
Laufzeit: 00:25 (Minuten : Sekunden)
insert /*+ APPEND */ into t20 select * from t10;
1. Verarbeitung
2. Verarbeitung
Verlagern des Ladeprozesses auf SSD-Platten
• Bestimmte Arbeitstabellen des ETL-Prozesses liegen auf gesonderten SSD-Platten• Die aktiven Partitionen großer Tabellen• Temporäre Tabellen
R R
B
S S S
D
D
DD
Enterprise Information Layer
User View Layer
Data Integration Layer
T
T
T
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
B
F
80%
20%
PEL
A
A: Aggregate
PELT
CTAS
CTAS
PELPartitionierteTabellen
PrüfungenSSD
SSD
SSD
SSD
SSDSSD
SSD
SSDSSDSSD
Verlagern des Ladeprozesses auf SSD-Platten
• Test mit Direct Path Load
Laufzeit: 00:10 (Minuten : Sekunden)
insert /*+ APPEND */ into t20 select * from t10;
Laufzeit: 00:10 (Minuten : Sekunden)
Create Table T10 as select * from t10;
CTAS mit SSD
APPEND mit SSD
Alle Messdaten in der Übersicht
Monat 10
Monat 11
Monat 12
Monat 13
Faktentabelle
Zeit
Region
Financial
Production
Human Res.
Store
Supplier
Marketing
Service
Neuer Monat
P1P2P3P4
4 4
89
Z1Z2Z3Z4
Temporäre Tabelle
Parallel Direct Path INSERT(Set Based) CREATE TABLE AS SELECT(CTAS)CREATE Indizes / Statistiken anlegenEXCHANGE Tabelle
Partition Exchange Loading (PEL)
DROPPARTITION
• Unvergleichbar schnell!
47
Partition Exchange Loading (PEL)-- Leere Partition an Zieltabelle hinzufügenALTER TABLE Bestellung ADD PARTITION "Nov08" VALUES LESS THAN (to_date('30-Nov-2008','dd-mon-yyyy'));
-- Neue leere temporäre Tabelle erstellenCREATE TABLE Bestellung_temp AS SELECT * FROM Bestellung WHERE ROWNUM < 1;
-- Inhalte laden INSERT INTO "PART"."BESTELLUNG_TEMP" (BESTELLNR, KUNDENCODE, BESTELLDATUM, LIEFERDATUM, BESTELL_TOTAL, AUFTRAGSART, VERTRIEBSKANAL) VALUES ('2', '3', TO_DATE('23.Nov.2008', 'DD-MON-RR'), to_date('23.Nov.2008', 'DD-MON-RR'), '44', 'Service', '6');Commit;
-- Erstellen Index auf temporäre TabelleCREATE INDEX Ind_Best_Dat_Nov ON Bestellung_temp ("BESTELLNR") NOLOGGING PARALLEL;
-- Temporäre Tabelle an die Zieltabelle anhängen ALTER TABLE Bestellung EXCHANGE PARTITION "Nov08" WITH TABLE Bestellung_temp INCLUDING INDEXES WITHOUT VALIDATION;
2
3
4
5
1
48
PEL – Auswirkungen auf die DWH-Verwaltung und Konzepte • Angleichung des Partition-Kriteriums auf den Lade-
Rythmus und damit die „Zeit“• Meist täglicher Load -> Tagespartitionen• Späteres Merge auf Monatsebene möglich / nötig
• Zwang zum späteren Monats-Merge nutzen für • Komprimierung • Reorganisation • ILM-Konzept
• Eine Partitionierungs-Ebene ist durch das PEL-Verfahren meist schon belegt
• Local-Indizierung (wenn überhaupt gebraucht) entstehen automatisch
Themenübersicht 1/2
• Anforderungen an den ETL-Prozess im Data Warehouse
• Speichermanagement und Grundlagentechniken• Blöcke, Extents, Segmente, Tablespace• Direct Path Load, Mengenbasiertes Laden• Logging / NoLogging• Partition Exchange and Load (PEL)
• Zugriff auf Quellsystemen• Umgang mit Deltadaten• Kopiertechniken / SQL Loader / Data Pump / External Tables
/ Transportable Tablespace
Datenbank-basierte ETL-Prozesse
50
Deltadaten Extrahieren
1
3
2
4
5
6
Änderungsdatum
Trigger
Deltabildungüber MINUS
Logminer
Streams
Golden Gate
LogFile
LogFile
LogFile
Table
Table
Table Table
Table
TableQueue
OLTP DWH
TableQueue
QueueTable
Queue Table
Herausforderungen beim Extrahieren
• Unterschiedliche Namen in Quell- und Zielsystemen
• Bewahrung der Konsistenz
• Zeitpunkt des Ladens kann kritisch sein
• Vollständigkeit der Daten
• Unterschiedliche GRANTs der User
• Zusätzlicher Netzwerkverkehr
• Meist ist nur das Delta der geänderten Daten gewünscht • Formate (Datum, Zeichensätze)
52
Einlesetechniken Vorsysteme
Oracle
NonOracle
EBCDICASCII
Applikationz. B.
SAP R/3
SQL-Loader
External Table
Database Link
Transportable TS
Datapump
ODBC
JDBC
Gateway
AP
I
API CALL
OracleDWH
SQL
SQL
SQL
SQL
SQL
SQL
BS CopyBS Copy
Direct Save
Datenbank-Trigger?
• Werden nur im Quellsystem angelegt• Beeinflusst Performance des Quellsystems• Eher als Notlösung anzusehen
• Wenn es kein Änderungsdatum in der Quelltabelle gibt• Zum Triggern Message-basierter oder Event-gesteuerter
LadeläufeCREATE OR REPLACE TRIGGER Bestellung BEFORE DELETE OR INSERT OR UPDATE ON Bestellung FOR EACH ROWWHEN (new.Bestellnr > 0)DECLARE sal_diff number;BEGIN INSERT INTO log_Bestellung (Alte_Bestell_Nr,Neue_Bstell_Nr) VALUES(old.Bestellnr,new.Bestellnr); END;/
54
SQL*Loader
• Loader Modes• Convential Path
• INSERT von Daten / UPDATE von Indizes / Auslösen von Triggern
• Auswertung von Constraints
• Direct Path • Formatieren der Daten in Blöcken und direktes Einfügen in die
Datafiles• Keine SGA-Operationen / kein INSERT auf SQL-Level
• Parallel Direct Path• Parallele SQL*Loader-Aufrufe
55
SQL*Loader – Empfehlungen
• Direct Path Load nutzen• Alle Integrity Constraints ausschalten
• NOT NULL, Unique und Primary Key Constraints
• Verhindern von Index-Aktualisierungen• UNRECOVERABLE Option wählen• Partitionen nach und nach laden
• Andere Partitionen bleiben für andere Benutzer im Zugriff
• Parallel laden, wenn es möglich ist • Nutzung paralleler Schreib-Threads• Alternativ parallele Jobs starten
56
Beispiel - Control File
OPTIONS (SKIP=1, BINDSIZE=50000, ERRORS=50, ROWS=200, DIRECT=TRUE, PARALLEL=TRUE, READSIZE=65536, RESUMABLE=TRUE,RESUMABLE_TIMEOUT=7200)UNRECOVERABLE LOAD DATACHARACTERSET WE8MSWIN1252INFILE 'C:\orte.csv' BADFILE 'orte.bad' DISCARDFILE 'orte.dis‚INTO TABLE dwh.tb_orte WHEN ort_id != BLANKS APPEND REENABLE DISABLED_CONSTRAINTS FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY "'" (orte_nr POSITION(1) INTEGER EXTERNAL , ort CHAR , plz CHAR , bundesland CHAR , region CHAR , nummernfeld INTEGER EXTERNAL )
57
Aufruf des SQL*Loaders
sqlldr userid=DWH/DWH control=c:\orte.ctl log=C:\orte.log
orte.csvorte.ctl
TB_ORTEDatenControlFile
58
Data Pump Architektur
Quelle: http://www.dbazine.com/blogs/blog-cf/chrisfoot/blogentry.2006-05-26.3042156388
59
Vereinfachte Verfahrensdarstellung
OLTP DWH
Schema OLTP
Besondere GRANTs
Schema DWH
Delta-Load
FTP
Export mit Data Pump (expdp)
Import mit Data Pump (impdp)
60
Oracle Data Pump
• Höhere Performance als bei IMP / EXP oder anderen Entlade-Verfahren
• Daten und / oder Metainformationen von DB Objekten• Größere Steuerungsmöglichkeit, d.h. mehr Parameter und
Kontrolle der Datenextraktion
• Leichtere Einbindung der Datenflüsse über Rechnergrenzen hinweg
• Parallelisierung in RAC-Umgebungen Instanz-übergreifend
• Kompression u. Verschlüsselung nach Bedarf• Legacy Mode zur Weiterverwendung von Ex-/Import Controls • Wiederanlauffähig
Release 2
61
Export der Daten
• Optional Flashback zum Absichern des Entlade-Zeitpunktes nutzen
• Remote-Export möglich (per NETWORK_LINK)• Wegfall von separatem FTP-Aufruf
• Einschränkung durch Query-Bedingung• Damit Zugriff z. B. auf „Last Update-Sätze“
• Default Export Location• D:\o11\admin\o11\dpdump\EXPDAT.DMP
62
Ablauf des Exports
• Export über Parameter-Datei• Export auch mit Remote-
Zugriff• Einschränkung der
Datenmenge durch QUERY
• Bei dem Import: REMAP auf das Schema
expdp dwh/dwh@o11 parfile=Para_EX.txt
impdp dwh2/dwh2@o11 DIRECTORY=DP_OUTDUMPFILE=EXP1.DMP LOGFILE=DP_OUT:imp_log REMAP_SCHEMA=DWH:DWH2
63
Parameterauswahl
SCHEMAS=HR DUMPFILE=expinclude.dmp DIRECTORY=dpump_dir1 LOGFILE=expinclude.log INCLUDE=TABLE:"IN ('EMPLOYEES', 'DEPARTMENTS')" INCLUDE=PROCEDURE INCLUDE=INDEX:"LIKE 'EMP%'“NETWORK_LINK=source_database_linkNOLOGFILE={y | n}PARALLEL=integerPARFILE=[directory_path]file_nameQUERY = [schema.][table_name:] query_clauseQUERY=employees:"WHERE department_id > 10 AND salary > 10000“REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
Interaktiver Modus von Data Pump
• CTRL-C zum Starten des interaktiven Modus• ADD_FILE
• Das Hinzufügen eines neuen Dump-Files ist möglich
• KILL_JOB• Prozess kann abgebrochen werden
• STOP_JOB• Aktueller Job wird beendet
• PARALLEL• Einstellung des Parallelisierungsgrads
• Eingabe von „continue_client“ führt zur normalen Monitor-Ausgabe zurück• FILESIZE• HELP• PARALLEL• START_JOB• STATUS• STOP_JOB
67
Laufzeitenbeispiel C:\Users\aschlauc>expdp dwh/dwh "DWH"."SYS_EXPORT_SCHEMA_01": dwh/******** wird gestartetSchStzung erfolgt mit Methode BLOCKS...Objekttyp SCHEMA_EXPORT/TABLE/TABLE_DATA wird verarbeitetGesamte SchStzung mit BLOCKS Methode: 4.570 GBObjekttyp SCHEMA_EXPORT/USER wird verarbeitetObjekttyp SCHEMA_EXPORT/SYSTEM_GRANT wird verarbeitetObjekttyp SCHEMA_EXPORT/ROLE_GRANT wird verarbeitetObjekttyp SCHEMA_EXPORT/DEFAULT_ROLE wird verarbeitetObjekttyp SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA wird verarbeitetObjekttyp SCHEMA_EXPORT/TABLE/TABLE wird verarbeitetObjekttyp SCHEMA_EXPORT/TABLE/COMMENT wird verarbeitetObjekttyp SCHEMA_EXPORT/PROCEDURE/PROCEDURE wird verarbeitetObjekttyp SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE wird verarbeitetObjekttyp SCHEMA_EXPORT/TABLE/INDEX/INDEX wird verarbeitetObjekttyp SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT wird verarbeitetObjekttyp SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS wird verarbeitet
Objekttyp SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS wird verarbeitet. . "DWH"."F_UMSATZ" 1.807 GB 51200000 Zeilen exportiert. . "DWH"."T10" 1.256 GB 8999991 Zeilen exportiert. . "DWH"."LIEFERUNG" 421.5 MB 1999999 Zeilen exportiert. . "DWH"."LIEFERUNG_COMP" 421.5 MB 1999999 Zeilen exportiert. . "DWH"."LIEFERUNG_MITTEL_COMP" 70.45 MB 1999999 Zeilen exportiert. . "DWH"."LIEFERUNG_MITTEL" 70.45 MB 1999999 Zeilen exportiert. . "DWH"."D_REGION" 469.8 KB 7202 Zeilen exportiert. . "DWH"."D_KUNDE" 209.9 KB 1029 Zeilen exportiert. . "DWH"."BESTELLUNGEN" 5.859 KB 4 Zeilen exportiert. . "DWH"."D_ARTIKEL" 16.40 KB 129 Zeilen exportiert. . "DWH"."D_VERTRIEBSKANAL" 6.859 KB 7 Zeilen exportiert. . "DWH"."KUNDE" 5.015 KB 2 Zeilen exportiert. . "DWH"."LIEFERUNGEN" 5.859 KB 4 Zeilen exportiert. . "DWH"."PRODUKT" 5.031 KB 3 Zeilen exportiert. . "DWH"."D_ZEIT" 0 KB 0 Zeilen exportiertMaster-Tabelle "DWH"."SYS_EXPORT_SCHEMA_01" erfolgreich geladen/entladen******************************************************************************
Testlaufzeiten
Gesamtlaufzeit für 4,5 GB Schreiben auf SSD 4 Cores Dumpfile 4,5 GB
Parallel 0 1: 42 MinutenParallel 2 0: 56 MinutenParallel 4 0: 52 Minuten
Alternative mit klassischem EXP: exp 3,5 Minuten
External Tables
• Tabelle, die eine Datei referenziert• Datei wird als normale Tabelle behandelt• Nur lesend zugreifbar• RMAN sichert nicht die Daten• Bulk-Loading Operationen, wie insert... select• Mehr Transformationsoptionen
als im SQL* Loader• Parallelisierbares Lesen• Alternative zum SQL*Loader
70
CREATE DIRECTORY Exttab AS 'D:\Szenario\Exttab';
DROP TABLE Gemeinde_EX;CREATE TABLE Gemeinde_EX ( Gemeinde_Nr VARCHAR2(8), Gemeinde VARCHAR2(50) )
ORGANIZATION EXTERNAL
(TYPE oracle_loaderDEFAULT DIRECTORY ExttabACCESS PARAMETERS (RECORDS DELIMITED BY newline BADFILE 'Gemeinde.bad‚ DISCARDFILE 'Gemeinde.dis‚ LOGFILE 'Gemeinde.log‚ SKIP 20 FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"‚ )LOCATION ('Gemeinde_CSV.TXT'))
GemeindeID;Gemeinde;KundenID;KreisID01001000;Flensburg;;0;100101002000;Kiel;;0;100201003000;Luebeck;;0;100301004000;Neumuenster;;0;100401051001;Albersdorf;;0;105101051002;Arkebek;;0;105101051003;Averlak;;0;105101051004;Bargenstedt;;0;105101051005;Barkenholm;;0;105101051006;Barlt;;0;105101051008;Bergewoehrden;;0;105101051010;Brickeln;;0;105101051011;Brunsbuettel;;0;1051
...........................
...........................
External Tables – Beispiel 1
71
Modifikationsmöglichkeiten
alter table ex_orte location ('ORTE_Y.CSV');
alter table ex_orte default directory LC_Texte_2;
create or replace directory LC_TEXTE_2 AS 'D:\Szenario\Testdaten';
72
Konzept zum einspielen von Dateien
1. Änderungsprozedur zum• Kopieren der Dateien• Umbenennen von Dateinamen
2. Änderungsprozedur zum• Ändern der Einträge in der
External Table• Ändern des Pfades im
Directory-Objekt
ABC120109ABC130109
ABC140109ABC150109
Sich täglich ändernde DateinamenDatum im DateinamenLieferantenname im Dateinamen
73
Preprocessing für External Tables
CREATE TABLE sales_transactions_ext (PROD_ID NUMBER, CUST_ID NUMBER ...)ORGANIZATION external (TYPE oracle_loader DEFAULT DIRECTORY data_file_dir ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII PREPROCESSOR exec_file_dir:'gunzip' OPTIONS '-C' BADFILE log_file_dir:'sh_sales.bad_xt' LOGFILE log_file_dir:'sh_sales.log_xt' FIELDS TERMINATED BY "|" LDRTRIM ( PROD_ID, CUST_ID, TIME_ID DATE(10) "YYYY-MM-DD", CHANNEL_ID, PROMO_ID, QUANTITY_SOLD, AMOUNT_SOLD, UNIT_COST, UNIT_PRICE)) location ('sh_sales.dat.gz')) REJECT LIMIT UNLIMITED;
Release 2
74
External Tables mit Data Pump
• Erstellen External Table in Quell-DB• Verwendung von CREATE AS SELECT * FROM <source_table>
• Das Ausführen des CREATE startet den Data Pump-Export
• Kopieren der Dump-Datei auf die Zielumgebung
• In der Zielumgebung neue External Table-Definition erstellen und aktivieren
• Durch Zugriff mit SELECT auf die External Table die Daten lesen
75
External Tables mit Data Pump
OLTP DWH
FTP
EX_T EX_T
76
External Tables mit Data Pump
OLTP DWH
select * from EX_Bestellung_2
77
Testzenario
OLTP DWH
Impliziter
FTP-Lauf
EX_T EX_T
OLTP DWH
DB_Link
CTAS
Bestellung
Bestellung
Bestellung Bestellung
Vorteile der Kombination
• Leichte Handhabung• Syntax der beiden Typen sehr ähnlich
• Hohe Performance• Data Pump-eigenes Format ist für schnellen Ex-/Import
ausgelegt• Parameter von Data Pump zusätzlich nutzen, um die zu
extrahierende Datenmenge auf das Wesentliche zu reduzieren
• Verbleiben innerhalb der SQL-Sprache• Durch CREATE TABLE AS SELECT lassen sich sowohl WHERE-Filter als auch Joins während des Extrahierens verarbeiten
79
Transportable Tablespaces
• Höchste Performance beim Austausch von Oracle zu Oracle• Daten werden als komplettes File oder File Set bewegt
• Austausch zwischen unterschiedlichen Betriebssystemen möglich • Konvertierung kann mit RMAN erfolgen, z.B. von
BigEndian nach LittleEndian
• Nützlich beim Bewegen der Daten zwischen Quellsystem und Staging Area sowie zwischen den anderen Schichten im Warehouse
80
Vorgehensweise
1. Anlegen des Tablespaces im Quellsystem
2. Zuweisung der zu kopierenden Daten zum Tablespace• Alle Daten sind dem Tablespace zugeordnet (Indizes etc.)
3. Ändern des Tablespaces auf Read-Only
4. Export der Metadaten mit Data Pump (EXPDP)
5. Eventuell Konvertierung des Tablespace Datafiles• Über die RMAN CONVERT Function
6. Kopieren des Tablespace Datafiles und der Metadaten
7. Import der Metadaten in der Zielumgebung
8. Ändern des Tablespaces auf Read-Write
81
Transportable Tablespaces
P1P2P3P4
4 4
89
Z1Z2Z3Z4
CREATE TABLE temp_jan_umsatzNOLOGGINGTABLESPACE ts_temp_umsatzASSELECT * FROM ?????????WHERE time_id BETWEEN '31-DEC-1999' AND '01-FEB-2000';
Index/Constraint freeParallel Direct Path InsertSet Based
1
2
3
4
ALTER TABLESPACE ts_temp_umsatz READ ONLY;
EXP TRANSPORT_TABLESPACE=yTABLESPACES=ts_temp_umsatzFILE=jan_umsatz.dmp
Kopieren des Tablespace zur Zielplattform
BS-CopyDaten
Metadaten
Buchhaltung
Produktion
Personal
Lager
Lieferanten
Marketing
Service
83
Transportable Tablespaces
IMP TRANSPORT_TABLESPACE=y DATAFILES='/db/tempjan.f'TABLESPACES=ts_temp_umsatzFILE=jan_umsatz.dmp
5
6
7
ALTER TABLESPACE ts_temp_umsatz READ WRITE;
ALTER TABLE umsatz ADD PARTITION umsatz_00jan VALUESLESS THAN (TO_DATE('01-feb-2000','dd-mon-yyyy'));ALTER TABLE umsatz EXCHANGE PARTITION umsatz_00janWITH TABLE temp_umsatz_janINCLUDING INDEXES WITH VALIDATION;
Metadaten
091999
101999
111999
121999
Fakttable Umsatz
Neuer Monat012000
84
Themenübersicht 2/2
• Planung und Organisation des ETL Prozesses• Schichten als Planungsgrundlage• Umgang mit separaten ETL-Tools und Lade-Engines• Prüftechniken mit SQL• Szenario zum Prüfen von Daten
• Weitere Datenbank-Techniken• Ersatz von Aggregat-Tabellen durch MAVs• Table Functions• Pivoting• Multiple Inserts / Merge
• Zusammenfassung
Datenbank-basierte ETL-Prozesse
85
R R
BS S
S
D
D
DD
Enterprise Information Layer User View LayerData Integration Layer
T
T
T
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
B
F
ETL: Kosten pro Kunde
F
F
D
D
D
D
ETL: Kosten pro Kunde
ETL: Kosten pro Kunde
B
B
ETL: Kosten pro Kunde
B
B
Transformation
Frühzeitige ETL-Aktivitäten schaffen SynergienDas Schichtenmodell hilft bei der Positionsfindung für Transformationen und Aggregationen
86
Die frühest mögliche Stelle für Transformationen und Prüfungen finden
Prüfungen
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
Enterprise Information Layer User View LayerData Integration Layer
R R
BS S
S
DD
DD
T
T
TB
F
F
F
D
D
D
DB
B
B
B
Frühzeitige ETL-Aktivitäten schaffen SynergienDas Schichtenmodell hilft bei der Positionsfindung für Transformationen und Aggregationen
87
Die frühest mögliche Stelle für Transformationen und Prüfungen finden
Prüfungen JoinsDistincts
Effizientes Laden beginnt so früh wie möglich
88
Data Integration Layer
T
T
T
T
T
Data Integration Layer
T
Logik so früh wie möglichWarum?
1:1
1:1
1:1
1:1
CTAS
Verteilte Server zwingen oft zu unproduktiven 1:1 LadevorgängenViele unnötige und versteckte Aufwände
Enterprise Information Layer
User View Layer
Data Integration Layer
Process neutral / 3 NF
User View Layer
User View Layer
1:1
1:1
1:1
Vorsystem mitVorrechner
Vorsystem
1:1
1:1
Eine Hardware (bzw. Cluster) / ein Ort ermöglicht flexibles Handeln durch kurze Wege
Enterprise Information Layer User View LayerData Integration Layer
Process neutral / 3 NF
Freie Wahlmöglichkeit
für Ort und Art des ETL
Zu viele teuere Ladestrecken
• Redundante Wege• Gefahr von 1:1 Kopien• Schwache Netze
Enterprise Information Layer User View LayerData Integration Layerc
Process neutral / 3 NFOLTP
Separater ETL Server
DWH Server
Balance zwischen den beteiligten Komponenten finden
DWH-Datenbank
DWH-ServerETL-Server
ETL-Engine
Balance zwischen den beteiligten Komponenten finden
DWH-Datenbank
DWH-ServerETL-Server
ETL-Engine
Balance zwischen den beteiligten Komponenten finden
DWH-Datenbank
DWH-ServerETL-Server
ETL-Engine
DokumentationSteuerungBenutzerfühung
Rechen-PowerAusnutzen von bestehenden Ressource
Aufwendige Extraktionsverfahren
OracleDWH
OracleOLTP
ETLTool
Server
1. Ladeschritt
2. Ladeschritt
Nur ein Ladeschritt !
Varianten von Regeln / Prüfungen
Attribut-bezogene Regeln 1. Not Null / Pflichtfelder
2. Formatangabena) numeric
b) Alphanumerisch
c) Date
d) Masken
3. Div. Check Constraint
4. Wertbereiche• Ober-/Untergrenzen / Wertelisten
Satz-bezogene Regeln5. Abhängigkeiten von Werten in anderen Attributen
desselben Satzes
Satz-übergreifende Regeln6. Primary Key / Eindeutigkeit
7. Aggregat – Bedingungena) Ober- Untergrenzen von Summen
b) Anzahl Sätze pro Intervall usw.
8. Rekursive Zusammenhänge• Verweise auf andere Sätze derselben Tabelle
(Relation)
Tabellen-übergreifende Regeln9. Foreign Key
a) Child-Parent (Orphan)b) Parent-Child
10. Aggregat – Bedingungena) Ober- Untergrenzen von Summenb) Anzahl Sätze pro Intervall usw.
11. Referenz-Zusammenhänge• Verweise auf Sätze einer anderen Tabelle (Relation)
Zeit-/ Zusammenhang-bezogene Regeln12. Zeitinvariante Inhalte
Anz. Bundesländer
13. Zeitabhängige Veränderungen 14. Über die Zeit mit anderen Daten korrelierende
Feldinhalte
Verteilungs-/Mengen-bezogene Regeln15. Verteilung
a) Arithmetische Mittelb) Varianz / Standardabweichungen
16. Qualitätsmerkmale und Mengen
96
Prüfen mit oder Ohne Datenbank-Constraints
• Constraints verlangsamen den Massen-Insert des ETL-Prozesses
• => Ohne Constraints arbeiten• => Prüfen mit SQL-Mitteln• => Prüfen mit DML-Errorlogging
• Nur bei wenigen Daten sinnvoll
Prüfkonzepte
• Einfach implementierbar• Bessere Performance• Nur bei aktivierten Constraints
Stage-Tabelle+ Geprüfte Daten
Kopieren
Statistiken
Date
Number
Varchar2()
BadFile
FehlerhafteSätze
CheckConstraints
StatistikRoutine
DMLError Log
• Fachliche Prüfungen kaum möglich• Eventuell zusätzliche Prüfungen
nötig
98
Error Logging
• Constraints• Unique Key / Primary Key• Foreign Key• NOT NULL• Check Constraint
Kunde
Kunde_err
KUNDENNRVORNAME NACHNAME ORTNR STRASSE TELEFON
KUNDENNRVORNAME NACHNAME ORTNR STRASSE TELEFON ORA_ERR_NUMBER$ORA_ERR_MESG$ ORA_ERR_ROWID$ORA_ERR_OPTYP$ ORA_ERR_TAG$
INSERT INTO Kunde
VALUES (......)
LOG ERRORS INTO kunde_err('load_20040802')
99
Testfall
Bestellung
1.100.000Sätze
100.000doppelt
Bestellung_CheckBESTELLNRORTNRKUNDENNRDATUMANZAHLPOS
BESTELLNRORTNRKUNDENNRDATUMANZAHLPOS
UNIQUE-CONSTRAINT
Bestellung_Check_Errors
BESTELLNRORTNRKUNDENNRDATUMANZAHLPOSORA_ERR_NUMBER$ORA_ERR_MESG$ORA_ERR_ROWID$ORA_ERR_OPTYP$ORA_ERR_TAG$
Testfall
begin dbms_errlog.create_error_log( dml_table_name => 'BESTELLUNG_CHECK', err_log_table_name => 'BESTELLUNG_CHECK_ERRORS' );end;
SQL> insert into bestellung_check select * from bestellung 2 LOG ERRORS INTO bestellung_check_errors ('daily_load') REJECT LIMIT 200000 3 ;
1000000 Zeilen erstellt.
Abgelaufen: 00:00:50.63
Die Alternative
create table Bestellung_non_unique as select bestellnr from (select count(BESTELLNR) n, bestellnr from bestellung group by bestellnr) where n > 1;
Tabelle wurde erstellt.
Abgelaufen: 00:00:00.49
insert /*+ APPEND */ into bestellung_check select B.BESTELLNR,B.ORTNR,B.KUNDENNR,B.DATUM , B.ANZAHLPOS from bestellung B where B.BESTELLNR not in (select bestellnr from Bestellung_non_unique);
900000 Zeilen erstellt.
Abgelaufen: 00:00:02.26Zusammen 00:00:03.15
1.
2.
Check Constraint mit Regular Expressions
CREATE TABLE Check_KUNDE (KUNDENNR NUMBER,GESCHLECHT NUMBER,VORNAME VARCHAR2(50),NACHNAME VARCHAR2(50),ANREDE VARCHAR2(10),GEBDAT DATE,ORTNR NUMBER,STRASSE VARCHAR2(50),TELEFON VARCHAR2(30));
ALTER TABLE check_kunde ADD CONSTRAINT Ch_KD_Name CHECK(REGEXP_LIKE(NACHNAME, '[^[:digit:]]'));
Regel: Im Kundennamen müssen Buchstaben vorkommen und keine reine Zahlenkolonne
INSERT INTO check_kunde (Kundennr, Geschlecht, Vorname, Nachname, Anrede, Gebdat, Ortnr, Strasse, Telefon) VALUES (9,1,'Klaus','123','Herr','01.01.60',2,'Haupstr.',08923456);
FEHLER in Zeile 1: ORA-02290: CHECK-Constraint (DWH.CH_KD_NAME) verletzt
104
• Verwendung von Regular Expressions steigert die Performance bei Prüfungen
Beispiele* Match 0 or more times
? Match 0 or 1 time
+ Match 1 or more times
{m} Match exactly m times
{m,} Match at least m times
{m, n} Match at least m times but no more than n times
\n Cause the previous expression to be repeated n times
[:alnum:] Alphanumeric characters
[:alpha:] Alphabetic characters
[:blank:] Blank Space Characters
[:cntrl:] Control characters (nonprinting)
[:digit:] Numeric digits
[:graph:] Any [:punct:], [:upper:], [:lower:], and [:digit:] chars
[:lower:] Lowercase alphabetic characters
[:print:] Printable characters
[:punct:] Punctuation characters
[:space:] Space characters (nonprinting), such as carriage return, newline, vertical tab, and form feed
[:upper:] Uppercase alphabetic characters
[:xdigit:] Hexidecimal characters
Modus
Zeichenklassen
105
Wichtiges Hilfsmittel für Einzelfeldprüfungen: CASE-Anweisung
SELECT CASE WHEN isnumeric('999') = 1 THEN 'numerisch' ‚ ELSE 'nicht numerisch'‚ END ErgebnisFROM dual;
CREATE OR REPLACE FUNCTION isnumeric ( p_string in varchar2) return boolean AS l_number number; BEGIN l_number := p_string; RETURN 1; EXCEPTION WHEN others THEN RETURN 0; END;
106
Hilfsfunktion:Date_Check
• In Verbindung mit der CASE-Anweisung
create or replace function IsDate (str varchar2) return varchar2 is inDate varchar2(40);
FUNCTION dateCheck (inputDate varchar2, inputMask varchar2) RETURN varchar2
IS dateVar date;BEGIN dateVar:= to_date(inputDate,inputMask); return 'true'; exception when others then return 'false';END;
BEGIN inDate:= trim(str); if dateCheck(inDate, 'mm-dd-yyyy') = 'false' AND dateCheck(inDate, 'mm-dd-yy') = 'false' AND dateCheck(inDate, 'yyyy-mm-dd') = 'false' AND dateCheck(inDate, 'yy-mm-dd') = 'false' AND dateCheck(inDate, 'yyyy-mon-dd') = 'false‚ AND dateCheck(inDate, 'yy-mon-dd') = 'false‚ AND dateCheck(inDate, 'dd-mon-yyyy') = 'false‚ AND dateCheck(inDate, 'dd-mon-yy') = 'false‚ AND dateCheck(inDate, 'mmddyy') = 'false‚ AND dateCheck(inDate, 'mmddyyyy') = 'false‚ AND dateCheck(inDate, 'yyyymmdd') = 'false' AND dateCheck(inDate, 'yymmdd') = 'false‚ AND dateCheck(inDate, 'yymmdd') = 'false' AND dateCheck(inDate, 'yymondd') = 'false‚ AND dateCheck(inDate, 'yyyymondd') = 'false‚ AND dateCheck(inDate, 'mm/dd/yyyy') = 'false' AND dateCheck(inDate, 'yyyy/mm/dd') = 'false‚ AND dateCheck(inDate, 'mm/dd/yy') = 'false' AND dateCheck(inDate, 'yy/mm/dd') = 'false‚ AND dateCheck(inDate, 'mm.dd.yyyy') = 'false' AND dateCheck(inDate, 'mm.dd.yy') = 'false' AND dateCheck(inDate, 'yyyy.mm.dd') = 'false' AND dateCheck(inDate, 'yy.mm.dd') = 'false' then return 'false'; else return 'true'; end if; --exception --when others then return 'false';
END;
107
Abarbeitungslogik für Einzelfeldprüfung mit CASE
• Temporäre Tabelle ist optional• Ist wesentlich übersichtlicher • Erlaubt Kombination von unterschiedlichen Prüfkriterien
Stage-Tabelle
Varchar2()
Kopieren
Gepruefte_Daten
Date
Number
Varchar2()Feld1Feld2Feld3
Temp-Tabelle
Varchar2()
Feld1Feld2Feld3
Feld1_is_nullFeld1_is_numericFeld2_is_numeric
INSERT INTO
temp_table
SELECT CASE ....FROMStage_Table
Error_Daten
Date
Number
Varchar2()
INSERT ALL WHEN Feld_1_is_null =1 into Error_Daten
WHEN Feld_1_is_null=0 into Gepruefte_Daten
108
Bestellnr
Menge
Summe
Name
Ort
BestDatum
Abarbeitungslogik mit CASE
Bestellnr
Menge
Summe
Name
Ort
BestDatum
Bestellnr_isNull
Menge_isNumeric
Summe_isNumeric
Summe_isNull
BestDatum_isDate
...
OLTP_Kunden
OLTP_Kunden_tmp
INSERT INTO OLTP_Kunden_tmpSELECT Bestellnr,Menge,Summe,Name,Ort,BestDatum,CASE WHEN (Bestellnr is NULL) then 1 ELSE 0 END Bestellnr_isNull,CASE WHEN (isNumeric(Menge) = 1) then 1 ELSE 0 END Menge_isNumeric,CASE WHEN (isNumeric(Summe) = 1) then 1 ELSE 0 END Summe_isNumeric,CASE WHEN (Summe is NULL) then 1 ELSE 0 END Summe_isNull,CASE WHEN (isDate(BestDatum) = 1) then 1 ELSE 0 END BestDatum_isDateFROM OLTP_Kunden;
Beispiel mit graphischer Modellierung:Einsatz von CASE und Zwischentabelle
110
Prüfung auf Eindeutigkeit:Beispiel graphisch und manuell
INSERT INTO el_kunde (kundennr,vorname,nachname,ortnr,strasse,telefon) SELECT src2.nummer,src2.name,src2.name,src2.nummer,src2.name,src2.nummer FROM SRC2,
(SELECT nummer FROM (SELECT count(nummer) n, nummer FROM src2 group by nummer) WHERE n = 1) doppelte
WHERE src2.nummer = doppelte.nummer;
111
Herausfiltern und Protokollieren von Feldern mit dem Wert „NOT NULL“
CASE WHEN F2 IS NULL THEN 1 ELSE 0 END
112
SELECT F1 FROM (SELECT count(F1) n,F1 FROM s GROUP BY F1) WHERE n > 1;
Prüfen auf Eindeutigkeit der Eingabesätze
Es dürfen nur Sätze geladen werden, die einmal im Quell-Bestand vorkommen
113
Inhaltliche Abhängigkeit von zwei Feldern
Die satzübergreifende Reihenfolge von den Werten einer Spalte muss mit der Reihenfolge in einer anderen Spalte übereinstimmen
114
Summenvergleich graphisch
Bestellung
Bestellposition
Bestellnummer (PK)Gesamtsumme
Bestellnummer (FK)Positionssumme
=
115
Szenario
• Regel bzgl. der Bestellungen• Es darf keine Bestellung ohne Positionen geben.• Bestellnummern müssen eindeutig sein.• Es kann nur Bestellungen mit gültigen Kundennummern geben.• Bestellungen müssen immer in einem Zeitraum +/- 10 Tage von dem
Tagestadum liegen.
•Regeln bzgl. der Bestellpositionen• Der durchschnittliche Wert einer Position muss > 5 sein. • Positionsnummern müssen pro Bestellung lückenlos von 1 beginnend aufsteigen sein.• Es darf nur Bestellpositionen mit einer gültigen Bestellnummer geben.• Es darf nur Bestellpositionen mit einer gültigen Artikelnummer geben.• Rabatt darf nur für Firmenkunden gegeben werden.• Formatprüfungen:
• Feld Depostelle 3-stellig alphanumerisch und 3-stellig numerisch • Feld Rabatt mus numerisch sein und mindestens den Wert 0 haben • Feld Menge muss gefüllt sein (NotNull) und muss > 0 sein
•Qualitative Prüfungen• Wenn der Gesamtwert pro Bestellung muss < 1000 beträgt, dann muss , wenn groesser,
dann markieren.• Der Gesamtumsatz ist i. d. R. in dem 4ten Quartal am höchsten.• Bestellungen haben einen bestimmte Anzahl Positionen.
Die Beispiel - Quellumgebung
117
ARTIKEL_SPARTENSPARTE_NAME SPARTE_NR
BESTELLPOSITION
BESTELLNRPOSITIONSNRMENGEARTIKELNRDEPOTSTELLERABATT
PK
ARTIKELARTIKEL_NAMEARTIKEL_IDGRUPPE_NRPREIS
ARTIKEL_GRUPPENGRUPPE_NR GRUPPE_NAMESPARTE_NR
BESTELLUNG
BESTELLNRORTNR KUNDENNR BESTELLDATUMANZAHLPOS
KUNDE
KUNDENNRKUNDENNAME BERUFSGRUPPE SEGMENTKUNDENTYP
PKPK
PKPK
PK
FK
FK
FK
FK
FK
Beispielprüfungen
Beispielprüfungen
1. Schritt: Prüfungen von Tabellen-übergreifenden Beziehungen
120
ARTIKEL_SPARTENSPARTE_NAME SPARTE_NR
BESTELLPOSITION
BESTELLNRPOSITIONSNRMENGEARTIKELNRDEPOTSTELLERABATT
PK
ARTIKELARTIKEL_NAMEARTIKEL_IDGRUPPE_NRPREIS
ARTIKEL_GRUPPENGRUPPE_NR GRUPPE_NAMESPARTE_NR
BESTELLUNG
BESTELLNRORTNR KUNDENNR BESTELLDATUMANZAHLPOS
KUNDE
KUNDENNRKUNDENNAME BERUFSGRUPPE SEGMENTKUNDENTYP
PKPK
PKPK
PK
FK
FK
FK
FK
FK
26
13
18
21
2. Schritt: Prüfungen und Berechnungen von Satz-übergreifenden Abhängigkeiten
121
ARTIKEL_SPARTENSPARTE_NAME SPARTE_NR
BESTELLPOSITION
BESTELLNRPOSITIONSNRMENGEARTIKELNRDEPOTSTELLERABATT
PK
ARTIKELARTIKEL_NAMEARTIKEL_IDGRUPPE_NRPREIS
ARTIKEL_GRUPPENGRUPPE_NR GRUPPE_NAMESPARTE_NR
BESTELLUNG
BESTELLNRORTNR KUNDENNR BESTELLDATUMANZAHLPOS
KUNDE
KUNDENNRKUNDENNAME BERUFSGRUPPE SEGMENTKUNDENTYP
PKPK
PKPK
PK
FK
FK
FK
FK
FK
26
13
18
21
113
4 9
14
10
3. Schritt: Feldprüfungen
122
ARTIKEL_SPARTENSPARTE_NAME SPARTE_NR
BESTELLPOSITION
BESTELLNRPOSITIONSNRMENGEARTIKELNRDEPOTSTELLERABATT
PK
ARTIKELARTIKEL_NAMEARTIKEL_IDGRUPPE_NRPREIS
ARTIKEL_GRUPPENGRUPPE_NR GRUPPE_NAMESPARTE_NR
BESTELLUNG
BESTELLNRORTNR KUNDENNR BESTELLDATUMANZAHLPOS
KUNDE
KUNDENNRKUNDENNAME BERUFSGRUPPE SEGMENTKUNDENTYP
PKPK
PKPK
PK
FK
FK
FK
FK
FK
26
13
18
21
113
4 9
14
10
5
6
8
11 12
15 16 1718
1920
Regeln bei der Ablauf-Planung
• Alles was mengenbasiert prüfbar ist, kommt zuerst• Feldbezogene Prüfungen sind nachgelagert• Bei aufwendigen Joins abklären, ob diese mehrfach
benötigt werden, wenn ja, dann • Prüfen einer Join-Tabelle• Nach Möglichkeit diese Prüfungen in eine zeitlich enge Abfolge
bringen
• Aufwendige feldbezogene Prüfungen, Prüfungen mit Funktionen usw. werden in einer einzigen Transformation zusamengefasst
• Bei Datenübernahme aus Datenbanken ist zu prüfen, ob innerhalb der Zielumgebung noch geprüft werden muss
• Bei Text-Eingabe-Daten die External Table bzw. Loader – Prüfmittel nutzen
Anordnung und Gruppierung der Ladeschritte des Beispiel-Szenarios
err_non_unique_bestellung
err_orphan_Bestellung
err_childless_Bestellung
err_orphan_Position
err_orphan_PositionArtikel
err_seq_pos_Bestellposition
err_anz_pos_Bestellposition
err_AVG_Pos_Wert
err_maske_depotstelle
err_Wert_Menge
err_not_null_Menge
err_not_Rabatt_Wert
err_kd_Rabatt_ok
BESTELLUNG
BESTELLPOSITION
KUNDE
ARTIKEL
BEST_POS
Tmp_ BEST_POS Tmp2_ BEST_POS
HauptdatenflussBeziehungsprüfungenHauptdatenflussHauptdatenfluss
Umsetzung der Prüfungen
Siehe separaten Ausdruck
Umsetzung der Prüfungen
Siehe separaten Ausdruck
Umsetzung der Prüfungen
Siehe separaten Ausdruck
Umsetzung der Prüfungen
Siehe separaten Ausdruck
Auflistung der Laufzeiten für die einzelnen Prüfungen (unterschiedliche Massnamen)
Themenübersicht 2/2
• Planung und Organisation des ETL Prozesses• Schichten als Planungsgrundlage• Umgang mit separaten ETL-Tools und Lade-Engines• Prüftechniken mit SQL• Szenario zum Prüfen von Daten
• Weitere Datenbank-Techniken• Ersatz von Aggregat-Tabellen durch MAVs• Table Functions • Pivoting• Multiple Inserts / Merge
• Zusammenfassung
Datenbank-basierte ETL-Prozesse
130
Aggregattabellen
• Die meisten Kennzahlen sind bekannt• In der Datenbank als Aggregattabellen vorbereiten • Nicht über das BI-Tool umsetzen (meist langsamer)
• Keine eigenständigen Aggregat-Tabellen• Haben separate Namen -> Zwang zu Änderungen in BI-Tools
• Fehlende Transparenz• Aktualität wird nicht automatisch festgestellt• Aggregate-Tabellen liefern nur genau die Daten, die tatsächlich
enthalten sind. Ableitungen, z. B. zusätzliche Aggregationen sind nicht möglich (Rewrite-Technik)
Umsätze
Orte
Regionen
Länder
Level 1 DefinitionenAttribute
Level 2DefinitionenAttribute
Level 3DefinitionenAttribute
DimensionOrt
Zeit
Produkt
FK_OrtFK_ZeitFK_Produkt
Kunde
QueryRewrite
MaterializedViewPartitions
Parallel+Cluster
Bitmap-Index
Star-Transformation
Analytical-Functions
Materialized Views entlasten denETL-Prozess
Top/Alle_Artikel
Segement
Artikelsparte
Artikelgruppe
Artikel
Artikelcharge
Materialized Views sparen Plattenplatz und minimieren die Objektanzahl
MengeUmsatz
Summe pro Charge
Summe pro Artikel
Summe pro Gruppe
Summe pro Sparte
Summe pro Segement
Summe pro Charge
Qu
er
y
Re
vi
ew
Nested Materialized Views nutzen bereits ausgeführte IO-Leistung
Aufwendige Join-Operation
DIM_Zeit FAKT_Umsatz DIM_Produkte
Umsatz Prod.Gr A
Umsatz Prod. Gr B relativ zum Gesamtjahresumsatz
Summierung/Monat
Summierung/Jahr
Umsatz Prod.Gr B
Basistabellen
Materialized ViewLevel 1
Materialized ViewLevel 2
Materialized ViewLevel 3
Materialized ViewLevel 4
134
IO
tf1 tf2
tf3
Stage_tabelle
Quelle Ziel
INSERT INTO Ziel SELECT * FROM (tf2(SELECT * FROM (tf1(SELECT * FROM Quelle))))
INSERT INTO Ziel SELECT * FROM tf( SELECT * FROM (Stage_tabelle))
Table Functions – Pipeline-VerfahrenParallelisierung trotz aufwendiger Programmierlogik
135
Begriffe im Bereich Table Functions
• Table Function• Funktionen, die eine Gruppe von Sätzen (SET) gleichzeitig bearbeitet.
Table Functions wirken wie physische Tabellen. Entsprechend werden sie auch in der FROM Klausel verwendet.
• Record Type • Ein komplexer, aus mehreren Feldern zusammengesetzter Datentyp.
• Nested Table• Eine Art virtuelle Tabelle (temporäre Tabelle im Speicher). Eine Table
Function kann eine solche Tabelle komplett an das aufrufende Kommando zurückgeben.
• Ref Cursor • Eine Art Pointer auf ein Result – Set einer Abfrage. Man übergibt einen Ref
Cursor einer Table Function, damit diese die Sätze des Result – Sets innerhalb der Function abarbeitet.
• Parallel• Table Functions können eingehende Sätze parallel bearbeiten, wenn diese
als Ref Cursor übergeben werden.• Pipelined
• Eine Table Function reicht bereits fertige Sätze an das aufrufende Kommando zur weiteren Verarbeitung weiter, während sie noch weitere Sätze bearbeitet.
136
If a = b...Update...Case...
CursorFetchLoop
Funktion
Table_Function( )
INSERT INTO Table SELECT Feld1, Feld2 FROM
Mengenbasierte VerarbeitungTrotz Programmierung
• Schnelle Verarbeitung (Pipelined)
• Objekttechnik • Parallelisierung
• Mehrere Rückgabewerte und Einzelrückgaben
• Cursor als Input• Schachtelbar
Return Table
pipe row(record Type)Variante 1
Variante 2
137
drop type Bestellung_X_t;create type Bestellung_X_t as object (BESTELLNR NUMBER(10),KUNDENCODE NUMBER(10),BESTELLDATUM DATE,LIEFERDATUM DATE,BESTELL_TOTAL NUMBER(12,2),Fehler_Datum DATE);
drop type Bestellung_X_t_table;create type Bestellung_X_t_table as TABLE of Bestellung_X_t;
create or replace package cursor_pkg as type Bestellung_t_rec IS RECORD ( BESTELLNR NUMBER(10), KUNDENCODE NUMBER(10), BESTELLDATUM DATE, LIEFERDATUM DATE, BESTELL_TOTAL NUMBER(12,2));END;
DefinitionRecord-Type
DefinitionNested-Table aufder Basis des Rekord-Types
DefinitionCursor als Typdes Übergabeparameters
Die Hilfstypen für Daten und Cursor
138
create or replace function f_Bestellung_X(cur cursor_pkg.refcur_t) RETURN Bestellung_X_t_table IS BESTELLNR NUMBER(10); KUNDENCODE NUMBER(10); BESTELLDATUM DATE; LIEFERDATUM DATE; BESTELL_TOTAL NUMBER(12,2); Fehler_Datum DATE; ORDER_ID NUMBER(10);
objset Bestellung_X_t_table := Bestellung_X_t_table();i number := 0;beginLOOP -- read from cursor variable FETCH cur into BESTELLNR,KUNDENCODE, BESTELLDATUM,LIEFERDATUM,BESTELL_TOTAL,ORDER_ID; -- ext when last row EXIT WHEN cur%NOTFOUND; i := i+1; if substr(to_char(LIEFERDATUM,'YYYY.MM.YY'),1,4) >2002 then Fehler_Datum := to_date('9999.12.12','YYYY.MM.DD'); else Fehler_Datum := LIEFERDATUM; End if; objset.extend; objset(i) := Bestellung_X_t(BESTELLNR,KUNDENCODE, BESTELLDATUM,LIEFERDATUM,BESTELL_TOTAL,Fehler_Datum);END LOOP; CLOSE cur; Return objset;END;
Übernahme von Ausgangssätzenals Cursor
Definieren einer Nested-Table-Strukturfür die spätere Rückgabe.
Lesen aus Cursor
Erweitern Nested-Table um einenSatz und Überführen eines Satzes indie Nested-Table
Rückgabe der kompletten Tabelle an das aufrufende Statement(Alternative zu PIPE).
Die Table Function
139
insert into bestellung_X select * from TABLE(f_Bestellung_X(CURSOR(SELECT * from Bestellung)))
select * from TABLE(f_bestellung(CURSOR(SELECT * from Bestellung)))
select count(*) from TABLE(f_bestellung(CURSOR(SELECT * from Bestellung))
Beispielaufrufe
140
Verhindern des mehrfachen Ladens
Bestellposition
Bestellung Insert into Ergebnisselect * from bestellung b, bestellposition pwhere b.PK = p.FK
Prüfung 1
Insert into Ergebnisselect * from bestellung b, bestellposition pwhere b.PK = p.FK
Prüfung 2
Insert into Ergebnisselect * from bestellung b, bestellposition pwhere b.PK = p.FK
Prüfung 3
Insert into Ergebnisselect * from bestellung b, bestellposition pwhere b.PK = p.FK
Prüfung 4
Der Join wird4 mal ausgeführt
Verhindern des mehrfachen Ladens
Bestellposition
Bestellung
Einlesen Cursor
Der Join wird1 mal ausgeführt
select * from TABLE(f_bestellung(CURSOR(select * from bestellung b, bestellposition p
where b.PK = p.FK)))
f_bestellung
Prüfung 1
Prüfung 2
Prüfung 3
Prüfung 4
Pipe
Native Support für Pivot und Unpivot
SALESREP Q1 Q2 Q3 Q4---------- ----- ----- ----- ----- 100 230 240 260 300 101 200 220 250 260 102 260 280 265 310
SALESREP QU REVENUE---------- -- ---------- 100 Q1 230 100 Q2 240 100 Q3 260 100 Q4 300 101 Q1 200 101 Q2 220 101 Q3 250 101 Q4 260 102 Q1 260 102 Q2 280 102 Q3 265 102 Q4 310
Sinnvoller Einsatz im Rahmendes ETL-Prozesses
143
Native Support für Pivot und Unpivot
select * from quarterly_salesunpivot include nulls(revenue for quarter in (q1,q2,q3,q4))order by salesrep, quarter ;
QUARTERLY_SALES
SALESREP Q1 Q2 Q3 Q4---------- ----- ----- ----- ----- 100 230 240 260 300 101 200 220 250 260 102 260 280 265 310
SALESREP QU REVENUE---------- -- ---------- 100 Q1 230 100 Q2 240 100 Q3 260 100 Q4 300 101 Q1 200 101 Q2 220 101 Q3 250 101 Q4 260 102 Q1 260 102 Q2 280 102 Q3 265 102 Q4 310
Sinnvoller Einsatz im Rahmendes ETL-Prozesses
144
Native Support für Pivot und Unpivot
SALESREP 'Q1' 'Q2' 'Q3' 'Q4'---------- ----- ----- ----- ----- 100 230 240 260 300 101 200 220 250 260 102 260 280 265 310
SALES_BY_QUARTER
SALESREP QU REVENUE---------- -- ---------- 100 Q1 230 100 Q2 240 100 Q3 160 100 Q4 90 100 Q3 100 100 Q4 140 100 Q4 70 101 Q1 200 101 Q2 220 101 Q3 250 101 Q4 260 102 Q1 260
select * from sales_by_quarterpivot (sum(revenue)for quarter in ('Q1','Q2','Q3','Q4'))order by salesrep ;
Sinnvoller Einsatz im Rahmendes ETL-Prozesses
145
Multiple Inserts verarbeiten
INSERT ALL WHEN STATUS = 'P'‚ THEN INTO WH_TRANS_PRIVAT (BESTELLMENGE,KUNDENCODE,BESTELL_TOTAL,STATUS) VALUES (BESTELLMENGE$1,KUNDENCODE$1,BESTELL_TOTAL$1,STATUS) WHEN STATUS = 'F'‚ THEN INTO WH_TRANS_FIRMA (BESTELLMENGE,KUNDENCODE,BESTELL_TOTAL,STATUS) VALUES (BESTELLMENGE$1,KUNDENCODE$1,BESTELL_TOTAL$1,STATUS) SELECT WH_TRANSAKTIONEN.BESTELLMENGE BESTELLMENGE$1, WH_TRANSAKTIONEN.KUNDENCODE KUNDENCODE$1, WH_TRANSAKTIONEN.BESTELL_TOTAL BESTELL_TOTAL$1, WH_TRANSAKTIONEN.STATUS STATUS FROM WH_TRANSAKTIONEN WH_TRANSAKTIONEN WHERE (WH_TRANSAKTIONEN.STATUS = 'P‚ /*SPLITTER.PRIVATKUNDEN*/) OR (WH_TRANSAKTIONEN.STATUS = 'F‚ /*SPLITTER.FIRMENKUNDEN*/);
146
MERGE INTO "Kunde_TGT" USING (SELECT "KUNDEN_STAMM"."KUNDENNR" "KUNDENNR", "KUNDEN_STAMM"."VORNAME" "VORNAME", "KUNDEN_STAMM"."NACHNAME" "NACHNAME", "KUNDEN_STAMM"."STATUS" "STATUS", "KUNDEN_STAMM"."STRASSE" "STRASSE", "KUNDEN_STAMM"."TELEFON" "TELEFON", "KUNDEN_STAMM"."TELEFAX" "TELEFAX„FROM "KUNDEN_STAMM" "KUNDEN_STAMM") MERGE_SUBQUERYON ( "Kunde_TGT"."KUNDENNR" = "MERGE_SUBQUERY"."KUNDENNR") WHEN NOT MATCHED THEN INSERT ("Kunde_TGT"."KUNDENNR", "Kunde_TGT"."VORNAME", "Kunde_TGT"."NACHNAME", "Kunde_TGT"."STATUS", "Kunde_TGT"."STRASSE", "Kunde_TGT"."TELEFON", "Kunde_TGT"."TELEFAX") VALUES ("MERGE_SUBQUERY"."KUNDENNR", "MERGE_SUBQUERY"."VORNAME", "MERGE_SUBQUERY"."NACHNAME", "MERGE_SUBQUERY"."STATUS", "MERGE_SUBQUERY"."STRASSE", "MERGE_SUBQUERY"."TELEFON", "MERGE_SUBQUERY"."TELEFAX") WHEN MATCHED THEN UPDATE SET "VORNAME" = "MERGE_SUBQUERY"."VORNAME", "NACHNAME" = "MERGE_SUBQUERY"."NACHNAME", "STATUS" = "MERGE_SUBQUERY"."STATUS", "STRASSE" = "MERGE_SUBQUERY"."STRASSE", "TELEFON" = "MERGE_SUBQUERY"."TELEFON", "TELEFAX" = "MERGE_SUBQUERY"."TELEFAX";
MERGE-Funktion
• Funktion MERGE dient dem gleichzeitigen INSERT und UPDATE
• Basierend auf dem Matching des definierten Schlüssels (ON-Klausel)
• Auch DELETE-Operationen möglich
147
Themenübersicht 2/2
• Planung und Organisation des ETL Prozesses• Schichten als Planungsgrundlage• Umgang mit separaten ETL-Tools und Lade-Engines• Szenario zum Prüfen von Daten• Szenario zum Prüfen von Daten
• Weitere Datenbank-Techniken• Ersatz von Aggregat-Tabellen durch MAVs• Table Functions• Pivoting• Multiple Inserts / Merge
• Zusammenfassung
Datenbank-basierte ETL-Prozesse
148
R R
B
S S S
D
D
DD
Enterprise Information Layer
User View Layer
Data Integration Layer
T
T
T
T: Transfertabellen
R: Referenztabellen
S: Stammdaten
B: Bewgungsdaten
D: Dimensionen
F: Fakten
B
F
80%
20%
PEL
Zusammenfassung der bevorzugten Lade-Varianten
149
A
A: Aggregate
PELT
CTAS
CTAS
PEL
Vorgelagerte Prüfungen
Mengen-basierte
Prüfungen
Vorbereitetetemporäre
Tabellen
Aggregatbildungdurch Materialized
Views
Partition Exchange
Partition Exchange
Konzentration aller Prüfungen Denormalisierung (Joins)und Aggregate
PartitionierteTabellen
Prüfungen
CTAS : Create Table As Select PEL : Partition Exchange and Load