Adattárház datavault töltés alapok
- Hub_Address: Új entitás a szállítási címhez.
CREATE TABLE Hub_Address (
Address_HashKey CHAR(32) PRIMARY KEY,
ShippingAddress VARCHAR(100) NOT NULL,
LoadDate DATETIME NOT NULL,
RecordSource VARCHAR(50)
);
INSERT INTO Hub_Address (Address_HashKey, ShippingAddress, LoadDate, RecordSource)
SELECT
MD5(ShippingAddress) AS Address_HashKey,
ShippingAddress,
LoadDate,
'raw_ecommerce_data' AS RecordSource
FROM raw_ecommerce_data
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Address ha WHERE ha.ShippingAddress = raw_ecommerce_data.ShippingAddress
);
Link tábla: Link_Order_Delivery
Ez összeköti a rendelést, az ügyfelet és a szállítási címet.
CREATE TABLE Link_Order_Delivery (
Link_HashKey CHAR(32) PRIMARY KEY,
Customer_HashKey CHAR(32) NOT NULL,
Order_HashKey CHAR(32) NOT NULL,
Address_HashKey CHAR(32) NOT NULL,
LoadDate DATETIME NOT NULL,
RecordSource VARCHAR(50),
FOREIGN KEY (Customer_HashKey) REFERENCES Hub_Customer(Customer_HashKey),
FOREIGN KEY (Order_HashKey) REFERENCES Hub_Order(Order_HashKey),
FOREIGN KEY (Address_HashKey) REFERENCES Hub_Address(Address_HashKey)
);
INSERT INTO Link_Order_Delivery (Link_HashKey, Customer_HashKey, Order_HashKey, Address_HashKey, LoadDate, RecordSource)
SELECT
MD5(CONCAT(hc.Customer_HashKey, ho.Order_HashKey, ha.Address_HashKey)) AS Link_HashKey,
hc.Customer_HashKey,
ho.Order_HashKey,
ha.Address_HashKey,
red.LoadDate,
'raw_ecommerce_data' AS RecordSource
FROM raw_ecommerce_data red
JOIN Hub_Customer hc ON hc.CustomerID = red.CustomerID
JOIN Hub_Order ho ON ho.OrderID = red.OrderID
JOIN Hub_Address ha ON ha.ShippingAddress = red.ShippingAddress
WHERE NOT EXISTS (
SELECT 1
FROM Link_Order_Delivery lod
WHERE lod.Customer_HashKey = hc.Customer_HashKey
AND lod.Order_HashKey = ho.Order_HashKey
AND lod.Address_HashKey = ha.Address_HashKey
);
Satellite: Sat_Address_Details
A szállítási címhez nem sok attribútum tartozik ebben az esetben, de ha pl. később országot vagy irányítószámot adnánk hozzá, itt tárolnánk.
CREATE TABLE Sat_Address_Details (
Address_HashKey CHAR(32) NOT NULL,
LoadDate DATETIME NOT NULL,
LoadEndDate DATETIME,
ShippingAddress VARCHAR(100),
RecordSource VARCHAR(50),
HashDiff CHAR(32),
PRIMARY KEY (Address_HashKey, LoadDate),
FOREIGN KEY (Address_HashKey) REFERENCES Hub_Address(Address_HashKey)
);
INSERT INTO Sat_Address_Details (Address_HashKey, LoadDate, LoadEndDate, ShippingAddress, RecordSource, HashDiff)
SELECT
ha.Address_HashKey,
red.LoadDate,
NULL AS LoadEndDate,
red.ShippingAddress,
'raw_ecommerce_data' AS RecordSource,
MD5(red.ShippingAddress) AS HashDiff
FROM raw_ecommerce_data red
JOIN Hub_Address ha ON ha.ShippingAddress = red.ShippingAddress
WHERE NOT EXISTS (
SELECT 1
FROM Sat_Address_Details sad
WHERE sad.Address_HashKey = ha.Address_HashKey
AND sad.HashDiff = MD5(red.ShippingAddress)
);
Fejlettebb megoldások és elvek
1. Delta betöltés optimalizálása
Ahelyett, hogy minden betöltésnél az összes adatot újraellenőriznénk, használhatunk egy "staging" réteget, amely csak a változásokat tartalmazza. Példa:
-- Staging tábla a változásoknak
CREATE TABLE staging_ecommerce_data AS
SELECT * FROM raw_ecommerce_data
WHERE LoadDate > (SELECT MAX(LoadDate) FROM Hub_Customer);
-- Csak a stagingből töltünk
INSERT INTO Hub_Customer (Customer_HashKey, CustomerID, LoadDate, RecordSource)
SELECT
MD5(CustomerID),
CustomerID,
LoadDate,
'staging_ecommerce_data'
FROM staging_ecommerce_data
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Customer hc WHERE hc.CustomerID = staging_ecommerce_data.CustomerID
);
2. Same-As-Link (SAL) használata
Ha azonosítjuk, hogy két üzleti kulcs (pl. két CustomerID) valójában ugyanazt az entitást jelenti (pl. duplikáció miatt), egy SAL táblát hozhatunk létre az összekapcsolásra.
3. Effectivity Satellite
Ha egy kapcsolat (pl. rendelés és cím) időbeli érvényességet igényel, egy Effectivity Satellite-et adhatunk a Link-hez:
CREATE TABLE Sat_Order_Delivery_Effectivity (
Link_HashKey CHAR(32) NOT NULL,
LoadDate DATETIME NOT NULL,
LoadEndDate DATETIME,
IsActive BOOLEAN,
RecordSource VARCHAR(50),
PRIMARY KEY (Link_HashKey, LoadDate),
FOREIGN KEY (Link_HashKey) REFERENCES Link_Order_Delivery(Link_HashKey)
);
4. Zero Record koncepció
Ha egy Satellite-be nem érkezik adat, egy "zero recordot" illeszthetünk be alapértelmezett értékekkel, hogy az ETL folyamat ne szakadjon meg.
Összegzés és jobb megoldások
- Elv: Mindig az üzleti logikát kövesd, ne a forrásrendszer struktúráját.
- Szabály: Kerüld a túl sok Satellite létrehozását egy Hub-hoz; ha több kontextus van (pl. ügyfél neve vs. ügyfél hitelminősítése), külön Satellite-eket használj.
- Optimalizáció: Használj indexeket a HashKey-ken és particionálást a nagy Satellite táblákhoz a lekérdezési teljesítmény növeléséért.
1. Delta betöltés (Delta Loading)
Mi az a delta betöltés?
A delta betöltés azt jelenti, hogy csak a forrásadatokban bekövetkezett változásokat (új rekordok, módosítások) töltjük be a Data Vault táblákba, ahelyett hogy az összes adatot minden alkalommal újra feldolgoznánk. Ez jelentősen csökkenti az ETL folyamatok futási idejét és az erőforrásigényt.
Példa forgatókönyv
Folytassuk az előző e-kereskedelmi példát. Tegyük fel, hogy a raw_ecommerce_data táblába új rekordok érkeztek, és egy meglévő ügyfél adatai módosultak:
Frissített forrás tábla: raw_ecommerce_data
CustomerID | CustomerName | OrderID | OrderDate | Product | ShippingAddress | LoadDate |
---|---|---|---|---|---|---|
C001 | John Doe | O1001 | 2025-03-01 | Laptop | 123 Main St, NY | 2025-03-24 10:00:00 |
C002 | Jane Smith | O1002 | 2025-03-02 | Phone | 456 Oak Rd, CA | 2025-03-24 10:00:00 |
C001 | John A. Doe | O1003 | 2025-03-03 | Tablet | 789 Pine Ave, NY | 2025-03-25 09:00:00 |
C003 | Alice Brown | O1004 | 2025-03-04 | Monitor | 101 Elm St, TX | 2025-03-25 09:00:00 |
Delta betöltési logika lépései
- Staging réteg létrehozása: Kiszűrjük a legutóbbi betöltés óta érkezett vagy módosult rekordokat.
- Hub betöltése: Csak az új üzleti kulcsokat adjuk hozzá.
- Link betöltése: Csak az új kapcsolatokat töltjük fel.
- Satellite betöltése: Ellenőrizzük a változásokat (HashDiff), és historizáljuk őket.
1. Staging tábla létrehozása
Először létrehozzuk a staging táblát, amely csak a változásokat tartalmazza:
CREATE TABLE staging_ecommerce_data AS
SELECT
CustomerID,
CustomerName,
OrderID,
OrderDate,
Product,
ShippingAddress,
LoadDate
FROM raw_ecommerce_data
WHERE LoadDate > (SELECT COALESCE(MAX(LoadDate), '1900-01-01') FROM Hub_Customer);
Eredmény:
CustomerID | CustomerName | OrderID | OrderDate | Product | ShippingAddress | LoadDate |
---|---|---|---|---|---|---|
C001 | John A. Doe | O1003 | 2025-03-03 | Tablet | 789 Pine Ave, NY | 2025-03-25 09:00:00 |
C003 | Alice Brown | O1004 | 2025-03-04 | Monitor | 101 Elm St, TX | 2025-03-25 09:00:00 |
2. Hub_Customer delta betöltése
Csak az új ügyfeleket (C003) töltjük be:
INSERT INTO Hub_Customer (Customer_HashKey, CustomerID, LoadDate, RecordSource)
SELECT
MD5(s.CustomerID) AS Customer_HashKey,
s.CustomerID,
s.LoadDate,
'staging_ecommerce_data' AS RecordSource
FROM staging_ecommerce_data s
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Customer hc WHERE hc.CustomerID = s.CustomerID
);
3. Hub_Order delta betöltése
Új rendelések (O1003, O1004) betöltése:
INSERT INTO Hub_Order (Order_HashKey, OrderID, LoadDate, RecordSource)
SELECT
MD5(s.OrderID) AS Order_HashKey,
s.OrderID,
s.LoadDate,
'staging_ecommerce_data' AS RecordSource
FROM staging_ecommerce_data s
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Order ho WHERE ho.OrderID = s.OrderID
);
4. Link_Order_Delivery delta betöltése
Új kapcsolatok betöltése:
INSERT INTO Link_Order_Delivery (Link_HashKey, Customer_HashKey, Order_HashKey, Address_HashKey, LoadDate, RecordSource)
SELECT
MD5(CONCAT(hc.Customer_HashKey, ho.Order_HashKey, ha.Address_HashKey)) AS Link_HashKey,
hc.Customer_HashKey,
ho.Order_HashKey,
ha.Address_HashKey,
s.LoadDate,
'staging_ecommerce_data' AS RecordSource
FROM staging_ecommerce_data s
JOIN Hub_Customer hc ON hc.CustomerID = s.CustomerID
JOIN Hub_Order ho ON ho.OrderID = s.OrderID
JOIN Hub_Address ha ON ha.ShippingAddress = s.ShippingAddress
WHERE NOT EXISTS (
SELECT 1
FROM Link_Order_Delivery lod
WHERE lod.Customer_HashKey = hc.Customer_HashKey
AND lod.Order_HashKey = ho.Order_HashKey
AND lod.Address_HashKey = ha.Address_HashKey
);
5. Sat_Customer_Details delta betöltése
Ellenőrizzük, hogy a CustomerName változott-e (pl. C001 esetén), és historizáljuk:
-- Először lezárjuk a régi rekordot, ha van változás
UPDATE Sat_Customer_Details
SET LoadEndDate = s.LoadDate
FROM staging_ecommerce_data s
JOIN Hub_Customer hc ON hc.CustomerID = s.CustomerID
WHERE Sat_Customer_Details.Customer_HashKey = hc.Customer_HashKey
AND Sat_Customer_Details.LoadEndDate IS NULL
AND Sat_Customer_Details.HashDiff != MD5(s.CustomerName);
-- Új rekord beszúrása, ha van változás
INSERT INTO Sat_Customer_Details (Customer_HashKey, LoadDate, LoadEndDate, CustomerName, RecordSource, HashDiff)
SELECT
hc.Customer_HashKey,
s.LoadDate,
NULL AS LoadEndDate,
s.CustomerName,
'staging_ecommerce_data' AS RecordSource,
MD5(s.CustomerName) AS HashDiff
FROM staging_ecommerce_data s
JOIN Hub_Customer hc ON hc.CustomerID = s.CustomerID
WHERE NOT EXISTS (
SELECT 1
FROM Sat_Customer_Details scd
WHERE scd.Customer_HashKey = hc.Customer_HashKey
AND scd.HashDiff = MD5(s.CustomerName)
AND scd.LoadEndDate IS NULL
);
Megjegyzés: A C001 esetében a név "John Doe"-ról "John A. Doe"-ra változott, így a régi rekord lezárul (LoadEndDate kitöltése), és új rekord kerül be.
2. Same-As-Link (SAL)
Mi az a Same-As-Link?
A SAL egy speciális Link tábla, amelyet arra használnak, hogy azonosítsuk és összekapcsoljuk azokat az üzleti kulcsokat, amelyek valójában ugyanazt az entitást reprezentálják (pl. duplikációk különböző forrásrendszerekből). Ez különösen hasznos, ha az adatok integritása nem tökéletes.
Példa forgatókönyv
Tegyük fel, hogy két forrásrendszerünk van, és az ügyfél azonosítója eltérő formátumú, de ugyanazt a személyt jelenti:
Forrás táblák
- raw_system1:
CustID Name LoadDate C001 John Doe 2025-03-24 10:00:00 - raw_system2:
ClientCode FullName LoadDate CLT-001 John A. Doe 2025-03-25 09:00:00
Feltételezzük, hogy üzleti logika vagy manuális ellenőrzés alapján tudjuk, hogy C001 és CLT-001 ugyanaz a személy.
SAL logika lépései
- Hub betöltése: Mindkét kulcs külön Hub rekordként kerül be.
- SAL tábla létrehozása: Összekapcsoljuk a két HashKey-t.
- Használat: Az üzleti rétegben a SAL alapján egységesíthetjük az entitásokat.
1. Hub_Customer betöltése
Mindkét rendszerből betöltjük az ügyfeleket:
INSERT INTO Hub_Customer (Customer_HashKey, CustomerID, LoadDate, RecordSource)
SELECT
MD5(CustID),
CustID,
LoadDate,
'raw_system1'
FROM raw_system1
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Customer hc WHERE hc.CustomerID = raw_system1.CustID
);
INSERT INTO Hub_Customer (Customer_HashKey, CustomerID, LoadDate, RecordSource)
SELECT
MD5(ClientCode),
ClientCode,
LoadDate,
'raw_system2'
FROM raw_system2
WHERE NOT EXISTS (
SELECT 1 FROM Hub_Customer hc WHERE hc.CustomerID = raw_system2.ClientCode
);
Eredmény Hub_Customer:
Customer_HashKey | CustomerID | LoadDate | RecordSource |
---|---|---|---|
hash(C001) | C001 | 2025-03-24 10:00:00 | raw_system1 |
hash(CLT-001) | CLT-001 | 2025-03-25 09:00:00 | raw_system2 |
2. SAL_Customer létrehozása és betöltése
Létrehozzuk a SAL táblát, amely összeköti a két azonosítót:
CREATE TABLE SAL_Customer (
SAL_HashKey CHAR(32) PRIMARY KEY,
Customer_HashKey_1 CHAR(32) NOT NULL,
Customer_HashKey_2 CHAR(32) NOT NULL,
LoadDate DATETIME NOT NULL,
RecordSource VARCHAR(50),
FOREIGN KEY (Customer_HashKey_1) REFERENCES Hub_Customer(Customer_HashKey),
FOREIGN KEY (Customer_HashKey_2) REFERENCES Hub_Customer(Customer_HashKey)
);
INSERT INTO SAL_Customer (SAL_HashKey, Customer_HashKey_1, Customer_HashKey_2, LoadDate, RecordSource)
VALUES (
MD5(CONCAT(MD5('C001'), MD5('CLT-001'))),
MD5('C001'),
MD5('CLT-001'),
'2025-03-25 10:00:00',
'manual_mapping'
);
3. Használat lekérdezésben
Ha az üzleti rétegben egységes ügyfélképet akarunk, a SAL alapján összekapcsolhatjuk:
SELECT
hc1.CustomerID AS System1_ID,
hc2.CustomerID AS System2_ID,
COALESCE(scd1.CustomerName, scd2.CustomerName) AS Unified_Name
FROM SAL_Customer sal
JOIN Hub_Customer hc1 ON hc1.Customer_HashKey = sal.Customer_HashKey_1
JOIN Hub_Customer hc2 ON hc2.Customer_HashKey = sal.Customer_HashKey_2
LEFT JOIN Sat_Customer_Details scd1 ON scd1.Customer_HashKey = hc1.Customer_HashKey AND scd1.LoadEndDate IS NULL
LEFT JOIN Sat_Customer_Details scd2 ON scd2.Customer_HashKey = hc2.Customer_HashKey AND scd2.LoadEndDate IS NULL;
Eredmény:
System1_ID | System2_ID | Unified_Name |
---|---|---|
C001 | CLT-001 | John A. Doe |
Összegzés
- Delta betöltés: Gyorsítja a folyamatokat azáltal, hogy csak a változásokat kezeli. Staging réteg és HashDiff kulcsfontosságú.
- SAL: Rugalmasan kezeli a duplikációkat, lehetővé téve az entitások egységesítését anélkül, hogy a nyers adatokat módosítanánk.
HASH alapok
A Data Vault adattárházban a hash-alapú azonosítók kulcsszerepet játszanak a HUB, LINK és SAT táblákban. Az MD5 mellett több más hash-algoritmus is használható, amelyek különböző előnyökkel és hátrányokkal rendelkeznek. Nézzük meg a leggyakoribb opciókat, azok előnyeit, hátrányait és a kiválasztás szempontjait.
1. Hash-algoritmusok összehasonlítása Data Vault esetén
Hash algoritmus | Előnyök | Hátrányok |
---|---|---|
MD5 | Gyors, rövid (128-bit), széleskörű támogatás, kompatibilis SQL rendszerekkel. | Ütközési kockázat (hash collision), nem kriptográfiailag biztonságos. |
SHA-1 | Jobb ütközésvédelem, hosszabb kulcs (160-bit). | Törhető (kriptoanalízis gyengeségek), lassabb, mint az MD5. |
SHA-256 | Erős biztonság, hosszú hash (256-bit), alacsony ütközési kockázat. | Lassabb, hosszabb kulcs miatt nagyobb tárhelyigény. |
SHA-512 | Nagyon erős biztonság, hosszú hash (512-bit), jövőbiztos. | Még lassabb és nagyobb tárolási igény. |
XXHash | Nagyon gyors, kisebb CPU-terhelés, skálázható. | Nem kriptográfiai célú, esetenként kisebb ütközési ellenállás. |
CityHash / FarmHash | Nagyon gyors, skálázható nagy adatmennyiségre, alacsony CPU-használat. | Nem minden adatbázis támogatja natívan. |
BLAKE2 | Biztonságos, gyorsabb, mint SHA-256. | Kevésbé elterjedt SQL-ben, nagyobb tárolási igény. |
2. Hash kiválasztási szempontok Data Vault-ban
-
Adatbázis támogatás
-
Ha natív SQL támogatás kell, akkor MD5, SHA-1, SHA-256 a legjobb választás.
-
Ha BigQuery, Snowflake, Redshift vagy más modern felhős adattárházat használsz, ott SHA-256 jobban támogatott.
-
-
Ütközés elkerülése
-
MD5 és SHA-1 esetében nagyobb az ütközési kockázat, így SHA-256 vagy BLAKE2 ajánlott, ha hosszú távon biztonság kell.
-
-
Sebesség vs. Biztonság
-
XXHash, CityHash, FarmHash gyorsabbak, de nem kriptobiztonságosak. Ha gyors hash kell, ezeket használhatod, ha nincs szigorú biztonsági követelmény.
-
SHA-256 vagy BLAKE2 jobb kompromisszum, mert biztonságos és nem extrém lassú.
-
-
Tárolási igény
-
MD5 (16 byte) és SHA-1 (20 byte) kisebb helyet foglal, ezért ha tárolás optimalizálás fontos, ezeket lehet használni.
-
SHA-256 (32 byte) és SHA-512 (64 byte) több helyet foglal, de biztonságosabb.
-
-
Kompatibilitás régi rendszerekkel
-
Ha régebbi adatbázisokkal kell kompatibilisnek lenned, MD5 vagy SHA-1 lehet a megoldás.
-
Ha új rendszert építesz, akkor SHA-256 vagy BLAKE2 jobb opció.
-
3. Javasolt hash-stratégia Data Vault-ban
-
Ha hagyományos adattárház és SQL-kompatibilitás kell → MD5 vagy SHA-256
-
Ha erős biztonság kell és ütközést kell kerülni → SHA-256 vagy BLAKE2
-
Ha nagy teljesítmény kell, de biztonság nem kulcsfontosságú → XXHash vagy CityHash
-
Ha modern felhőalapú adattárházat használsz (BigQuery, Snowflake) → SHA-256
🔹 Ajánlott kompromisszum: SHA-256, mert biztonságos, elérhető SQL-ben, és hosszú távon megbízható.
Mutatok konkrét SQL példákat a hash-algoritmusok használatára Data Vault adattárházban különböző adatbázisokban.
1. MD5 használata (pl. SQL Server, PostgreSQL, MySQL)
📌 HUB ügyfél tábla (HUB_CUSTOMER) betöltése
👉 Magyarázat:
-
HASHBYTES('MD5', CUSTOMER_ID)
: MD5 hash generálása. -
CONVERT(VARBINARY(16), ...)
: Tömörebb tárolás érdekében bináris formátumra alakítja az értéket. -
STG_CUSTOMER
: Az ügyfél adatok forrása.
📌 LINK ügyfél és szerződés kapcsolat (LINK_CONTRACT_CUSTOMER)
👉 Üzleti kulcsok kombinációja alapján képzett hash biztosítja a kapcsolat egyediségét.
2. SHA-256 használata (pl. PostgreSQL, Snowflake, BigQuery, Redshift)
📌 HUB ügyfél tábla (PostgreSQL / Redshift / Snowflake)
👉 Magyarázat:
-
DIGEST(CUSTOMER_ID, 'sha256')
: SHA-256 hash generálása. -
ENCODE(..., 'hex')
: A bináris hash átalakítása hexadecimális formátumba.
📌 SAT ügyfél historizált attribútumok (változáskezelés)
👉 Üzleti logika:
-
Ha az ügyfél neve változik, új rekordot hozunk létre az SAT táblában.
-
HASH_DIFF biztosítja, hogy csak változás esetén legyen új rekord.
3. XXHash használata (pl. BigQuery, Snowflake, Redshift, ClickHouse)
📌 HUB ügyfél tábla (BigQuery)
👉 Gyorsabb, de nem kriptográfiailag biztonságos.
📌 SAT ügyfél historizált attribútumok (BigQuery)
👉 Használat:
-
BigQuery FARM_FINGERPRINT: Rendkívül gyors, jól skálázódik nagy adatmennyiséggel.
-
Előny: Olcsóbb és gyorsabb, mint SHA-256, ha nem kell kriptobiztonság.
-
Hátrány: Nem garantált, hogy ütközésmentes nagy adathalmazoknál.
4. BLAKE2 használata (PostgreSQL, Snowflake, ClickHouse, modern adatbázisok)
📌 HUB ügyfél tábla BLAKE2 hash-sel (PostgreSQL)
👉 BLAKE2 előnyei:
-
Gyorsabb, mint SHA-256, de ugyanolyan biztonságos.
-
Alacsony CPU-terhelés, jól optimalizált.
Összegzés - Melyik hash-algoritmust érdemes választani?
Szenárió | Ajánlott hash-algoritmus |
---|---|
SQL Server, MySQL, PostgreSQL régi verziók | MD5, SHA-256 |
BigQuery, Snowflake, Redshift | SHA-256, FARM_FINGERPRINT (XXHash) |
Ha fontos a sebesség | XXHash, CityHash, FarmHash |
Ha fontos a biztonság és ütközésmentesség | SHA-256, BLAKE2 |
Ha modern felhős adattárházat használsz | SHA-256 vagy BLAKE2 |
Ha kisebb tárolási igény kell | MD5, SHA-1 |
🔹 Legjobb kompromisszum: SHA-256 vagy BLAKE2.
Ha nagyon nagy teljesítmény kell és nem számít a kriptobiztonság, akkor XXHash (FARM_FINGERPRINT) is jó választás.
Az SQL finomhangolása Data Vault esetén több tényezőtől függ, például:
✅ Indexek és petícionálás
✅ Tömörítés és tárolási optimalizálás
✅ Batch vs. stream feldolgozás
✅ Paralelizálás és optimalizált JOIN-ok
✅ Optimalizált hash-képzés
Lássuk részletesen, hogyan lehet az SQL-t optimalizálni és finomhangolni különböző adatbázisokban!
1. Indexek és particionálás – Gyorsabb keresés és csatlakozás
A hash-kulcsokra érdemes indexet vagy partitioning-et beállítani, hogy a keresések és csatlakozások gyorsabbak legyenek.
1.1. Indexek (PostgreSQL, SQL Server, MySQL)
📌 Példa egy HUB táblára, ahol indexeket használunk a gyors kereséshez:
📌 Ha egyedi kulcsokat akarunk garantálni:
✔ Előnyök:
-
Az index gyorsabbá teszi a keresést és a JOIN műveleteket.
-
A UNIQUE INDEX biztosítja, hogy ne legyen duplikáció a kapcsolatokat tároló LINK táblában.
1.2. Particionálás nagy táblákhoz (PostgreSQL, Redshift, BigQuery)
📌 Ha nagy mennyiségű adatunk van, érdemes particionálni pl. dátum szerint:
✔ Előnyök:
-
Csak az adott dátumhoz tartozó adatokat olvassa be, gyorsabb keresés!
-
Hatalmas adattáblák esetén a teljesítmény 10-100x gyorsabb lehet.
2. Tömörítés és tárolási optimalizálás – Kevesebb tárhely, gyorsabb feldolgozás
Hash-ek és historizált adatok esetén sokat lehet spórolni a megfelelő tárolási formátummal.
📌 VARBINARY használata MD5 hash esetén (SQL Server, MySQL)
✔ Előnyök:
-
A hash tárolása kevesebb helyet foglal (pl. VARCHAR(32) helyett VARBINARY(16)).
📌 Tömörített tárolás BigQuery esetén
✔ Előnyök:
-
CLUSTER BY segít, hogy a lekérdezések kisebb adathalmazt érjenek el.
-
PARTITION BY segít, hogy csak az adott dátumhoz tartozó adatokat olvassa be.
3. Batch vs. Stream feldolgozás – Hogyan töltsd be az adatokat hatékonyan?
3.1. Batch betöltés (PostgreSQL, SQL Server)
Ha napi vagy óránkénti betöltés kell, a MERGE vagy INSERT...SELECT hatékony.
📌 Példa ügyfél HUB tábla betöltésére:
✔ Előnyök:
-
Csak az új ügyfeleket tölti be → nincs duplikáció.
-
Hatékony összehasonlítás HASH segítségével.
3.2. Stream feldolgozás (BigQuery, Snowflake, Kafka)
📌 Ha real-time töltés kell, akkor BigQuery-ben vagy Snowflake-ben pl. INSERT INTO használható:
✔ Előnyök:
-
Gyors, mert nem kell duplikációt ellenőrizni (ezt a stream processing kezeli).
4. Paralelizálás és optimalizált JOIN-ok – Hogyan csökkentsd a lekérdezési időt?
Ha nagy adathalmazokkal dolgozol, fontos, hogy a JOIN műveletek gyorsak legyenek.
4.1. JOIN optimalizálás a HUB és SAT között
📌 Ha van index, akkor a JOIN gyorsabb lesz:
✔ Előnyök:
-
Az index miatt csak a szükséges sorokat olvassa be.
📌 Ha nagy az adat, érdemes HASH JOIN-t használni (pl. Snowflake, Redshift, BigQuery)
✔ Előnyök:
-
HASH JOIN gyorsabb, ha nincs index.
-
OLAP adatbázisoknál (BigQuery, Snowflake, Redshift) hatékonyabb.
5. Optimalizált hash-képzés – Hogyan csökkentsd a CPU-terhelést?
Hash-függvények optimalizálása nagy adatmennyiség esetén csökkenti a CPU-használatot.
📌 Ha gyors hash kell, használj FARM_FINGERPRINT-et BigQuery-ben:
✔ Előnyök:
-
Gyorsabb, mint SHA-256, de nem kriptobiztonságos.
📌 Ha biztonság kell, használd a megfelelő algoritmust:
✔ Előnyök:
-
Biztonságosabb, mint MD5 és hosszabb távon megbízhatóbb.
Összegzés – Hogyan finomhangold az SQL-t?
✅ Használj indexeket és particionálást a gyorsabb keresésekhez.
✅ Batch vs. Stream feldolgozást optimalizáld az igényeid szerint.
✅ JOIN műveleteknél HASH JOIN vagy megfelelő indexelés legyen.
✅ Optimalizáld a hash-képzést, hogy csökkentsd a CPU-használatot.
Oracle adatbázis hash képzés alapok
Az Oracle adatbázisban a hash-algoritmusok és optimalizálási lehetőségek kritikus szerepet játszanak Data Vault modellben, különösen HUB, LINK, SAT táblák betöltésekor. Nézzük meg részletesen:
1. Hash-algoritmusok Oracle-ben
Oracle adatbázisban többféle beépített hash-függvény érhető el, például:
-
MD5 →
DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(data), DBMS_CRYPTO.HASH_MD5)
-
SHA-1, SHA-256, SHA-512 →
DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(data), DBMS_CRYPTO.HASH_SH256)
-
ORACLE STANDARD_HASH (Ajánlott!) →
STANDARD_HASH(data, 'SHA256')
🔹 Ajánlott: STANDARD_HASH, mert gyorsabb, egyszerűbb és Oracle optimalizálta.
📌 Példa HUB ügyfél hash-képzésre:
👉 Előnyök:
-
Gyorsabb, mint DBMS_CRYPTO (nincs szükség RAW konverzióra).
-
Tömörebb kód (könnyebb olvasni és karbantartani).
-
Támogatott algoritmusok: MD5, SHA1, SHA256, SHA384, SHA512.
📌 Alternatíva – DBMS_CRYPTO használata:
👉 Előnyök:
-
Biztonságosabb (bármilyen adatot kezel).
-
Kompatibilis régebbi verziókkal.
2. HUB tábla optimalizált betöltése hash kulcsokkal
📌 HUB_CUSTOMER betöltés optimalizált hash-sel és indexekkel:
👉 Optimalizálás:
-
HASH kulcs indexelése:
-
Particionálás dátum szerint (gyorsabb keresés):
✔ Előnyök:
-
Csak az új rekordokat keresed ki gyorsan.
-
Nem kell teljes táblát bejárni minden JOIN-nál.
-
Index gyorsítja a hash alapú csatlakozásokat.
3. LINK táblák optimalizálása – Több hash kombinációja
📌 LINK ügyfél és szerződés kapcsolat betöltése optimalizált módon:
👉 Optimalizálás:
-
Több kulcs kombinálása hash-ben (
CUSTOMER_ID || CONTRACT_ID
). -
Rövidebb storage footprint → VARCHAR2(64) helyett RAW(32):
✔ Előnyök:
-
Gyorsabb keresések (RAW kevesebb helyet foglal, kisebb indexméret).
-
Csökkenti az I/O műveleteket.
4. SAT tábla optimalizálása – Hash alapú változásdetektálás (SCD-2)
📌 Ügyfél historizált adatok betöltése változás detektálással:
👉 Optimalizálás:
-
Csak akkor tölt új rekordot, ha változás történt (HASH_DIFF eltér).
-
Index HASH_DIFF mezőn:
✔ Előnyök:
-
Minimalizálja az új rekordok számát (csak változás esetén új sor).
-
Gyorsabb összehasonlítás HASH_DIFF alapján.
5. Optimalizált JOIN-ok hash kulcsokkal
Hash-kulcsok használata gyorsíthatja a csatlakozásokat HUB és SAT között.
📌 Optimalizált JOIN a HUB és SAT között
👉 Optimalizálás:
-
/*+ USE_HASH(SAT) */
→ HASH JOIN kényszerítése, ha a tábla nagy. -
Partition Pruning használata:
✔ Előnyök:
-
Nagyobb táblák esetén gyorsabb, mint NESTED LOOP JOIN.
-
Csak a releváns particiókat olvassa be.
6. Hash-képzés finomhangolása – CPU és I/O optimalizálás
🔹 Tippek a hash-képzés gyorsítására Oracle-ben:
-
Használj
STANDARD_HASH
-tDBMS_CRYPTO.HASH
helyett – gyorsabb! -
VARBINARY helyett RAW(32)-t használj a hash tárolására:
-
Használj particionálást (LOAD_DATE) és clusterezett indexeket.
-
Tuning: optimalizált paraméterek beállítása:
-
Parallel betöltés gyorsításához:
Összegzés
✅ Használj STANDARD_HASH-t a gyorsabb és optimalizált hash-képzéshez.
✅ Indexeld és particionáld a hash mezőket a gyors keresésekhez.
✅ Használj HASH JOIN-t és RAW(32) tárolást a jobb teljesítmény érdekében.
✅ Csak a változott rekordokat töltsd be (HASH_DIFF ellenőrzéssel).
Oracle hangolása
Az Oracle adatbázis finomhangolása kulcsfontosságú a teljesítmény maximalizálásához, különösen nagy adattárházak esetében. Az alábbiakban részletesen bemutatom az SQL lekérdezések, indexek, memóriahasználat, paralelizmus és egyéb finomhangolási technikák optimalizálását.
1. SQL finomhangolása
A teljesítmény legfontosabb tényezője a hatékony SQL írás és a megfelelő végrehajtási terv kiválasztása.
1.1. EXPLAIN PLAN és SQL Profile használata
📌 Nézd meg, hogyan tervezi végrehajtani az SQL-t az Oracle:
🔹 Mit cimkékre figyelj:
-
FULL TABLE SCAN → Kerüld! Használj indexeket, ha kell!
-
HASH JOIN vs. NESTED LOOPS → Nagy adatoknál HASH JOIN jobb!
-
INDEX RANGE SCAN → Jó választás keresésekhez!
📌 SQL Profile generálás automatikusan:
👉 Előny: Az Oracle automatikusan optimalizálja a végrehajtási tervet.
1.2. Indexek finomhangolása
Indexek segítenek a keresési teljesítményben, de nem mindig!
📌 Milyen indexeket használj?
-
B-Tree index – Gyors keresés egyedi értékeknél.
-
Bitmap index – Ha kevés egyedi érték van (
YES/NO
,STATUS
oszlopok). -
Function-Based Index – Ha keresés során átalakítod az oszlop értékét:
-
Particionált Index – Nagy adattábláknál jobb teljesítményt adhat.
📌 Indexek gyors felmérése:
🔹 Optimalizálás:
-
Túl sok index → Lassítja az INSERT/UPDATE műveleteket.
-
Ha indexet ritkán használnak → DROP INDEX lehet hasznos.
2. Memória és cache optimalizálása
Az Oracle rendelkezik SGA (System Global Area) és PGA (Program Global Area) memóriaterületekkel. Ezek finomhangolása javítja az SQL végrehajtás sebességét.
2.1. SGA és PGA memória beállítása
📌 Ellenőrizd a jelenlegi memóriahasználatot:
📌 Memóriabeállítás automatikusan:
🔹 Tipp: SGA_TARGET és PGA_TARGET megfelelő méretezése csökkenti az I/O műveleteket.
2.2. Result Cache bekapcsolása
A Result Cache segítségével az Oracle gyorsítótárba menti a lekérdezés eredményét, így ha többször futtatod ugyanazt a SQL-t, sokkal gyorsabb lesz.
📌 Engedélyezés:
📌 Használata egy SQL-ben:
👉 Előnyök:
-
Lassú aggregációk gyorsítása (pl.
COUNT
,SUM
,AVG
). -
Több user ugyanazt az adatot kéri le → gyorsítja a válaszidőt.
3. Paralelizmus optimalizálása (Parallel Query)
A paralelizmus kihasználása óriási teljesítménynövekedést hozhat!
📌 Parallel Query bekapcsolása:
📌 Automatikus paralelizmus:
🔹 Tipp: Ha az adatok nagyméretűek, használj PARALLEL
hintet a gyorsítás érdekében!
4. Adattáblák és particionálás finomhangolása
Ha az adattábla nagyon nagy, particionálás segíthet csökkenteni az I/O műveleteket.
📌 Példa havi particionálásra:
👉 Előnyök:
-
Gyorsabb keresés: Az Oracle csak a releváns partíciót olvassa be.
-
Partition Pruning → Csak a szükséges partíciót dolgozza fel.
5. Log fájlok és redo/undo kezelés optimalizálása
Ha az INSERT/UPDATE/DELETE műveletek lassúak, a redo/undo log kezelés optimalizálható.
📌 Redo log méretének növelése:
📌 UNDO tablespace méretének növelése:
🔹 Tipp:
-
Ha nagy INSERT-eket végzel, kapcsold ki a redo logot ideiglenesen:
-
Ha SELECT INTO TEMP tábla lassú, növeld a
TEMP
méretét:
Összegzés – Oracle finomhangolási tippek
✅ EXPLAIN PLAN + SQL Profile használata → Megérted, miért lassú az SQL.
✅ Indexek optimalizálása → Ne használj feleslegesen sok indexet.
✅ SGA/PGA memória optimalizálása → Kevesebb I/O, gyorsabb végrehajtás.
✅ Parallel Query bekapcsolása → Nagy adatoknál sokkal gyorsabb.
✅ Particionálás → Gyorsabb keresések és jobb teljesítmény.
✅ Redo/Undo optimalizálás → Gyorsabb INSERT/UPDATE/DELETE műveletek.
Megjegyzések
Megjegyzés küldése