SQL modellezés Turáni Balázs
Multidimenzionális tömb Forrás: http://blogs.technet.com/blogfiles/andrew/WindowsLiveWriter/OLAPCubesandMultidimensionalAnalysis_10C03/cube.jpg Mérték oszlopok Select utasítás révén kapott EREDMÉNYHALMAZ MODEL Partíció oszlopok Dimenzió oszlopok Szabályok
Mire jó az SQL modellezés? Lekérdezés eredményéből multidimenzionális tömböt készíthetünk. Ebből a tömbből bizonyos képletek (szabályok) segítségével új értékeket nyerhetünk ki. Szabályok = műveletek, melyek alapvető számtani műveletektől a szimultán rekurziókig széles skálán mozognak.
SQL Modellezés előnye: Ora 10g vezette be > 11gR1>11gR2 Korlátlan adatmennyiséggel képes dolgozni. OLAP illetve OLTP adattáblák esetében egyaránt használható Lényegében az előelemzés eszköze. Modellezési, tervezési lehetőségeket kínál.
Model klauzula Multidimenzionális tömböt a Model klauzula segítségével állítjuk elő. Model klauzula az SQL blokk része.
SELECT + MODEL SELECT SzelekciósLista FROM Táblalista WHERE LogikaiOszlopkifejezés GROUP BY CsoportosítóOszlopkifejezésLista HAVING LogikaiOszlopkifejezés ORDER BY RendezőOszlopkifejezésLista MODEL
Model klauzula alapszintaxisa MAIN <fő_model_neve> PARTITION BY (oszlop <másodlagos_név>) DIMENSION BY (oszlop <másodlagos_név> , oszlop <másodlagos_név>) MEASURES (<oszlop <másodlagos_név> , oszlop<másodlagos_név>) RULES <szabály opciók> RETURN {ALL|UPDATED} ROWS [IGNORE NAV] | [KEEP NAV] [UPDATE | UPSERT | UPSERT ALL] [AUTOMATIC ORDER | SEQUENTIAL ORDER] [ITERATE (<szám>) [UNTIL <feltétel>]]
Partíció oszlopok Lekérdezés eredményhalmazán definiálnak logikai tartományokat (eredményhalmazt blokkokra osztják) A partíciók egymástól függetlenek. Model klauzula szabályai valamennyi partícióra vonatkoznak. Utasítása: PARTITION BY (…)
Dimenzió oszlopok Definiálják a multidimenzionális tömböt. Partíción belüli cellák azonosítására használjuk. Dimenziók egy teljes kombinációja csak egy cellát azonosíthat a tömbön belül. DIMENSION BY (…)
Mérték oszlopok Megegyeznek a csillag sémában lévő ténytábla mérték oszlopaival. Jellemzően numerikus adatokat tartalmaznak. Pl. valamely termék eladási ára, illetve az adott termékből eladott mennyiség…stb. MEASURES (…)
Szabályok Szabályok hozzáférnek a mérték oszlop értékeihez. Ezeket az értékeket módosíthatják is (frissíthetik). Szabályok tömörek, könnyen kezelhetőek, helyettesítő karaktereket és ciklus szerkezeteket is tartalmazhatnak. RULES (…)
1. példa: SELECT region, cat, year, sales FROM sale WHERE region IN ('East', 'West') AND year IN ('1999','2000','2001') MODEL PARTITION BY (region) DIMENSION BY (cat, year) MEASURES (sales) RULES ( sales['PROD1', 2001] = sales['PROD1',1999] + sales['PROD1',2000], sales['PROD2', 2001] = sales['PROD2',1999] + sales['PROD2',2000], sales['PROD3', 2001] = sales['PROD3',1999] + sales['PROD3',2000] ) ORDER BY region, cat, year, sales;
2. példa SELECT prod_type,year, s FROM sale WHERE region IN ('East') AND year IN ('1999','2000','2001') MODEL DIMENSION BY (prod_type, year) MEASURES (sales s) RULES UPSERT ( s['FOOD',2001] = 1.2*s['MOVIE',1999] + s['MOVIE',2000], s['MOVIE', 2001] = s['MOVIE',1999] + s['MOVIE',2000], s['GAME', 2001] = AVG(s)[CV(prod_type), year<2000] ) ORDER BY year, prod_type;
3. példa Összesen kategória egy származtatott érték. SELECT region, prod_type, year, sales FROM sale WHERE region IN ('East', 'West') AND year IN ('1999','2000','2001') MODEL PARTITION BY (region) DIMENSION BY (prod_type, year) MEASURES (sales) RULES ( sales['MOVIE', 2001] = sales['MOVIE', 2000] + sales['MOVIE', 1999], sales['FOOD', 2001] = sales['FOOD',2000], sales['GAME', 2001] = sales['GAME', 2000] + sales['GAME', 1999], sales['ÖSSZESEN',2001] =sales['MOVIE', 2001] + sales['FOOD', 2001] + sales['GAME', 2001] ) ORDER BY region, prod_type, year; Összesen kategória egy származtatott érték.
SQL Model használata: Cellacímzés: Cellacímzés vonatkozhat: Cellák frissíthetők Hivatkozni is lehet rájuk. Formái: s['MOVIE', '2001'] (pozícionális) s[prod_type='MOVIE', YEAR='1999'] (szimbolikus) Cellacímzés vonatkozhat: Egyedi cellákra Cella tartományokra
4. példa: SELECT region,prod_type, year, sales FROM sale WHERE region IN ('East','West') AND prod_type='MOVIE' MODEL -- RETURN UPDATED ROWS PARTITION BY (prod_type) DIMENSION BY (region, year) MEASURES (sales) RULES UPDATE ( sales[region='West', year=2000] = sales['West',1999] + sales['West',1998], sales[region='East', year=2000] = MAX(sales)['East', year BETWEEN 1998 AND 2000] ) ORDER BY year,region;
Szimbolikus tömb feldolgozás AVG(s)[prod_type='MOVIE‘,year BETWEEN '1998' AND '2000'] AVG(s)[prod_type='MOVIE', YEAR<='2000']
UPSERT, UPSERT ALL, UPDATE UPSERT alap értelmezett (bemeneti adatok között nem szereplő cellaértékek létrehozására használhatjuk) Ha: Cella létezik → frissülni fog Nem létezik → létrejön a cella UPDATE (csak frissít, új cellát sohasem szúr be)
5. példa: SELECT region, prod_type, year, sales FROM sale MODEL RETURN UPDATED ROWS PARTITION BY (prod_type) DIMENSION BY (region, year) MEASURES (sales) RULES ( UPDATE sales['West', 2000] = 199999.11, UPSERT sales['West', 2007] = sales['West', 1999] + sales['West', 2000] ) ORDER BY region;
Dimenziók helyettesítésének lehetőségei Egy dimenzióban lévő összes érték megadásához az ANY és IS ANY használható. sales[ ANY,2000] = 1.3*sales['West',1999], sales[region IS ANY, 1999] = sales['West',1999]
Dimenzióértékek elérése CV függvény használatával Egy cella dimenzió-értékének eléréséhez a szabály jobb oldalán használható a CV függvény, amely a szabály bal oldalán lévő megfelelő értékekre hivatkozik. sales[region='West', year=2000] = 1.2*sales['West',1999], sales[region='East', year=2000] = 1.2*sales['East',1999], sales[region='Central', year=2000] =1.2*sales['Central',1999] Tömörebben: sales[ region IN ('West','East', 'Central'), year=2000]= 1.2*sales[CV(region),1999]
Szabályok automatikus rendezése AUTOMATIC ORDER utasítással érhető el. sales['West', 2001] = sales['West', 2000] + sales['West',1999], sales['West', 2000] = 50000, sales['West', 1999] = 40000 Sorrend: 1999-es év 2000-es év 2001-es év Az első az utolsó kettőtől függ.
Hivatkozó modellek Egy főmodell read-only (kizárólag olvasható) tömbök formájában több modellhivatkozást (is) tartalmazhat. Különböző dimenzionalitásban kapcsolhatunk össze modelleket. Adattáblák: ft(régió, év, eladások), cr(régió, ráta), dollar_eladások['West',2001] = eladások['West',2000] * ráta['West']
6. példa: SELECT region, prod_type, year, sales FROM sale WHERE region IN ('West','East') MODEL RETURN UPDATED ROWS MAIN simple_model PARTITION BY (region) DIMENSION BY (prod_type, year) MEASURES (sales) RULES( sales['FOOD',2000] = 150000, sales['FOOD', 2001] = sales['FOOD',1999] + sales['FOOD',2000], sales['MOVIE', 2001] = sales[ 'MOVIE',2000] ) ORDER BY region, prod_type, year;
Megjegyzés Jegyezzük meg, hogy a MODEL klauzula nem frissít, vagy szúr be sorokat az adatbázis tábláiba. A következő lekérdezés jól illusztrálja, hogy az előbbi modelles adatfeldolgozás által a sale adattábla nem módosult. SELECT region, prod_type, year, sales FROM sale WHERE region IN ('West','East') AND year IN (2000, 2001);