Ugrás a fő tartalomra

Adattárház inkrementális töltése

 Az incrementális / változás követő adattárház töltés jellemzői közé tartoznak a következők:





Adatváltozások kezelése: Az incrementális töltés során csak azokat az adatokat töltjük be, amelyek megváltoztak az előző töltés óta. Ez csökkenti a feldolgozási időt és az erőforrásigényt1.


Hatékonyság: Mivel csak a változásokat kell feldolgozni, az incrementális töltés gyorsabb és hatékonyabb, mint a teljes újratöltés. Ez különösen nagy adattárházak esetén előnyös1.


Kisebb adatforgalom: Az incrementális töltés kevesebb adatot mozgat, ami csökkenti a hálózati terhelést és az adatbázis terhelését1.


Konzisztencia fenntartása: Az incrementális töltés során fontos az adatkonzisztencia fenntartása, különösen akkor, ha több forrásból származó adatokat integrálunk1.


Időbélyegek használata: Az adatváltozások nyomon követéséhez gyakran használnak időbélyegeket vagy verziószámokat, amelyek segítenek azonosítani a frissítendő rekordokat1.


Micro-batch feldolgozás: Az incrementális töltés gyakran micro-batch feldolgozással történik, ahol kisebb adatcsomagokat dolgoznak fel rövidebb időközönként


További szempontok

Delta vagy CDC technika  Az adatok változásának követésére és kiválasztására különböző módszereket használhatunk, például logikai időbélyegek, trigger-ek vagy naplóállományok elemzését.

Betöltési időablakok  Az inkrementális töltés gyakran előre meghatározott időablakokban történik (pl. óránként, naponta, hetente).

Konfliktuskezelés Meg kell oldani a duplikációkat, törölt rekordok kezelését és az adatok konzisztenciáját.

Backup és visszaállítási lehetőségek  A részleges töltések miatt fontos a megfelelő visszaállítási stratégia kialakítása hiba esetére.


Forrás táblák töltési folyamata

Forrásadatok előkészítése

  • Az adatforrásokból (OLTP rendszerek Dblink, CSV, API stb.) a szükséges rekordokat kiválasztják.
  • Ha az adatok nagy mennyiségűek, akkor particionált vagy szűrt lekérdezések használhatók.


Változások azonosítása (Change Data Capture - CDC)


A megváltozott adatok azonosításához időbélyeg (timestamp), verziószám, vagy egyéb technikák szükségesek:

TIMESTAMP alapú változáskövetés: ha a forrás táblák tartalmaznak egy LAST_UPDATE_DATE mezőt, akkor ezt lehet használni.

LOG MINER vagy Materialized View Logs (MVIEW Logs): ezek az Oracle beépített mechanizmusai a változások követésére.

Triggers vagy Audit Tables: egyedi fejlesztéssel trigger-ek vagy naplózási táblák használhatók a változások követésére.


Adatok betöltése staging (előfeldolgozási) rétegbe

  • Az új vagy módosított rekordokat egy staging táblába másoljuk (pl. STG_CUSTOMERS).
  • Az adatokat tisztítjuk, validáljuk és transzformáljuk.
  • Delta feldolgozás és céladatbázis frissítése


Az adatok betöltése az adattárházba (DWH layer) háromféleképpen történhet:

  • INSERT: ha az új rekord még nem létezik a céladatbázisban.
  • UPDATE: ha egy meglévő rekord módosult.
  • DELETE vagy SOFT DELETE: ha egy rekord törlődik vagy archiválásra kerül.


Partíciózás és indexek optimalizálása

Particionálás: nagy adatmennyiségnél időalapú vagy hash-partíciókat lehet használni.

Indexek kezelése: az inkrementális töltés előtt/után az indexek karbantartása szükséges.


Szükséges technikai mezők és szerepük

Technikai Mező                  Szerepe

- ID vagy PRIMARY KEY

Egyedi azonosító minden rekordhoz, amely alapján az UPDATE/DELETE műveletek végrehajthatók.


- LAST_UPDATE_DATE vagy LAST_MODIFIED_DATE

Az utolsó módosítás időpontja, amely segít az inkrementális betöltésben.


- CREATED_DATE                 

Az adat létrehozásának időpontja, amely segíthet a változások nyomon  követésében.


- IS_DELETED vagy STATUS_FLAG

Az adatok törlésének vagy állapotának jelölésére (pl. 'A' – aktív, 'D' – törölt).


- BATCH_ID / LOAD_ID

Az aktuális betöltési folyamat azonosítója, amely segít a hibaelhárításban és a rollback műveletekben.


- SOURCE_SYSTEM_ID

Több forrás esetén az azonosításukra használt mező.


- VERSION_NUMBER

Verziókövetés esetén segít a duplikációk kezelésében és az időalapú elemzésekben.


- HASH_KEY vagy CHECKSUM

Hasznos lehet az adatok változásának nyomon követésére, különösen ha az adatok nem rendelkeznek egyértelmű timestamp mezővel.



Minták:


Incrementális adatok kiválasztása időbélyeg alapján

SELECT * 
FROM SOURCE_TABLE 
WHERE LAST_UPDATE_DATE >= TO_DATE('2025-02-01', 'YYYY-MM-DD');



Adatok betöltése a Staging táblába

INSERT INTO STG_CUSTOMERS (ID, NAME, LAST_UPDATE_DATE, IS_DELETED)
SELECT ID, NAME, LAST_UPDATE_DATE, IS_DELETED 
FROM SOURCE_TABLE 
WHERE LAST_UPDATE_DATE >= (SELECT MAX(LAST_UPDATE_DATE) FROM DWH_CUSTOMERS);


Delta Update a céladatbázisba

MERGE INTO DWH_CUSTOMERS d
USING STG_CUSTOMERS s
ON (d.ID = s.ID)
WHEN MATCHED THEN 
    UPDATE SET d.NAME = s.NAME, d.LAST_UPDATE_DATE = s.LAST_UPDATE_DATE
WHEN NOT MATCHED THEN 
    INSERT (ID, NAME, LAST_UPDATE_DATE) VALUES (s.ID, s.NAME, s.LAST_UPDATE_DATE);

Használhatunk seciális eszközöket/technológiákat a változás követésre  (pl. GoldenGate, Materialized View Log, LogMiner) .


A hash-kód delta képzéshez is használható

Hash-kód generálása forrásadatokból

Egy kiválasztott oszlopcsoportból (pl. az összes releváns mezőből) hash-kódot számítunk.

A hash-kódot egy hash-függvény segítségével képezzük (pl. Oracle DBMS_CRYPTO.HASH, ORA_HASH, STANDARD_HASH).



Adatok összehasonlítása a forrásoldali és a céladatbázisban levő tábla tartalommal

  • Az új hash-kódot összevetjük a céladatbázisban tárolt hash-kóddal.
  • Ha a hash-kód megváltozott, akkor az adott rekord módosult.
  • Ha nincs egyező rekord, akkor új bejegyzésről van szó.


Minta:

Tegyük fel, hogy van egy CUSTOMERS tábla az alábbi mezőkkel:

  • CUSTOMER_ID
  • NAME
  • EMAIL
  • PHONE_NUMBER
  • LAST_UPDATE_DATE

Ahelyett, hogy az összes oszlopot soronként összehasonlítanánk, generálhatunk egy hash-kódot ezekből az oszlopokból, és ezt használhatjuk a változások detektálására.


Hash-kód generálása forrásoldalon

SELECT CUSTOMER_ID, 
       STANDARD_HASH(NAME || EMAIL || PHONE_NUMBER, 'SHA256') AS HASH_VALUE 
FROM SOURCE_CUSTOMERS;

Itt a STANDARD_HASH függvény egy egyedi SHA256 hash-t generál a NAME, EMAIL és PHONE_NUMBER oszlopok alapján.


Hash-kód összevetése a céladatbázissal

SELECT s.CUSTOMER_ID, s.HASH_VALUE, d.HASH_VALUE 
FROM SOURCE_CUSTOMERS s 
LEFT JOIN DWH_CUSTOMERS d 
ON s.CUSTOMER_ID = d.CUSTOMER_ID 
WHERE s.HASH_VALUE <> d.HASH_VALUE OR d.CUSTOMER_ID IS NULL;

Ez a lekérdezés azokat a rekordokat adja vissza, ahol az adatok módosultak vagy újonnan jelentek meg.


Megváltozott adatok frissítése az adattárházban

MERGE INTO DWH_CUSTOMERS d
USING (
    SELECT CUSTOMER_ID, NAME, EMAIL, PHONE_NUMBER, 
           STANDARD_HASH(NAME || EMAIL || PHONE_NUMBER, 'SHA256') AS HASH_VALUE 
    FROM SOURCE_CUSTOMERS
) s
ON (d.CUSTOMER_ID = s.CUSTOMER_ID)
WHEN MATCHED AND d.HASH_VALUE <> s.HASH_VALUE THEN 
    UPDATE SET d.NAME = s.NAME, 
               d.EMAIL = s.EMAIL, 
               d.PHONE_NUMBER = s.PHONE_NUMBER, 
               d.HASH_VALUE = s.HASH_VALUE
WHEN NOT MATCHED THEN 
    INSERT (CUSTOMER_ID, NAME, EMAIL, PHONE_NUMBER, HASH_VALUE) 
    VALUES (s.CUSTOMER_ID, s.NAME, s.EMAIL, s.PHONE_NUMBER, s.HASH_VALUE);


Ezzel biztosítjuk, hogy:
  • Az adatok frissülnek, ha a hash-kód megváltozott.
  • Új rekordok bekerülnek.


Milyen előnyei és hatásai vannak a hash-kód alapú delta képzésnek?

Előnyök:

  • Gyors összehasonlítás – Ahelyett, hogy minden oszlopot egyenként vizsgálnánk, csak a hash-kódokat kell összehasonlítani.
  • Kevesebb erőforrás-felhasználás – Nagyobb táblák esetén is hatékony, mert nem szükséges minden mezőt lekérdezni.
  • Egyszerű implementáció – SQL-ben egyszerűen kezelhető hash függvényekkel.
  • Nem függ az időbélyegtől – Ha az időbélyeg nem megbízható, a hash-kód megoldást nyújthat.

Lehetséges problémák és korlátok:

  • Hash-ütközések (nagyon ritka) – Bár nagyon kis eséllyel, de két különböző adat generálhat azonos hash-kódot (különösen gyenge hash-függvényeknél, pl. ORA_HASH).
  • Nagy adatmennyiségnél számítási költség – A hash-kód kiszámítása CPU-intenzív lehet nagy mennyiségű rekord esetén.
  • Nem mutatja a konkrét változást – Csak azt jelzi, hogy egy rekord változott, de azt nem, hogy melyik mező módosult.

Mikor érdemes használni?

✔ Ha nagy mennyiségű adatot kell összehasonlítani inkrementális betöltéshez.
✔ Ha nincs egyértelmű vagy megbízható timestamp vagy verziószám.
✔ Ha gyors összehasonlításra van szükség, például napi frissítésnél.
✔ Ha a forrás és cél adatszerkezet nem teljesen azonos, de a releváns mezők egyezősége biztosított.






Megjegyzések