Obecná kvantifikace v relačních databázích Přehled typů dat a algoritmů Alan Eckhardt
Úvod Je vůbec obecná kvantifikace potřeba? – Ano Využití – OLAP, dobývání znalostí,… Nejčastěji implementováno pomocí operátoru dělení
Opakování - dělení Definice operace dělení: Nechť x relace nad schématem X, y relace nad schématem Y, kde Y X. Pak x y = x[X-Y] \ ( ( (x[X-Y]y) \ x ) [X-Y] ) Co to ale znamená? – x – studenti, y – vybrané přednášky – otázka : Kteří žáci mají zapsané všechny vybrané přednášky? – odpověď : x y
Terminologie Dále budeme používat tyto pojmy – Dělitel pro tabulku Y – Dělenec pro tabulku X – Podíl bude výsledek operace dělení Předpokládáme – Schéma dělitele je {D} – Schéma dělence je {Q,D} – Z toho plyne, že schéma podílu je {Q}
Předmět zájmu Chceme přijít na to, jak bychom nejlépe implementovali operaci dělení Chceme ji provádět na co nejobecnějších datech
Jak vypadá naše databáze? Nejlépe „prázdná“ databáze – To je nejobecnější případ, nepředpokládají se žádné vlastnosti daných dat či pomocných struktur Čím bychom si pomohli – Využití pomocných struktur – indexů, skupinových indexů apod. – Předpřipravená data – seskupená nebo i setříděná podle vhodného(ých) sloupce(ů)
Seskupená data Nadále se nebudeme zabývat pomocnými strukturami Využijeme předpřipravenost dat Kdy to může nastat – Data mohou být seskupena či setříděna již v databázi (podle klíče,…) – Data jsou výstupem nějaké operace, která je již setřídila (spojení sléváním,…)
Klasifikace dat TřídaDělitel Q D 0NNN 1NNG 2NGN 3NG1G1 G2G2 4NG1G1 G1G1 5GNN 6GNG 7G1G1 G2G2 N 8G2G2 G1G1 N 9G1G1 G2G2 G3G3 10G1G1 G2G2 G2G2 11G2G2 G1G1 G3G3 12G2G2 G1G1 G1G1 N – neseskupeno G – seskupeno Pro nás budou důležité třídy 0, 2, 5 a 10
Předmět zájmu Chceme přijít na to, jak bychom nejlépe implementovali operaci dělení Chceme ji provádět na co nejobecnějších datech
Algoritmy dělení Dva základní druhy algoritmů – Přímé porovnání – Souhrnný přístup První využívá přímé porovnání řádků tabulek Druhý pracuje s počty řádek
Přímé porovnání Algoritmy využívající přímé porovnání řádek – hnízděné cykly – třídění a slévání – seskupování a slévání – hashovací funkce
Hnízděné cykly Dělitel v paměti Postupně čteme dělenec – Zkontrolujeme, zda jsme data v Q již nečetli – Projdeme celý dělenec a zkontrolujeme, zda obsahuje řádky pro každou položku z dělitele – V takovém případě dáme na výstup danou hodnotu Q
Třídění a slévání (TAS) Musíme mít setříděný dělitel Dále máme seskupený dělenec podle Q a setříděný v rámci skupiny podle D Pro každou skupinu zkontrolujeme, zda obsahuje všechny položky z dělitele
Seskupování a slévání (SAS) Seskupený dělenec podle Q Seskupený dělitel Pro každou skupinu z dělence – Každý řádek porovnám s dělitelem a v případě shody nastavím správný bit na jedna – Pokud jsou na konci všechny bity rovny jedné, dám skupinu na výstup
Hashovací funkce I Pro každý řádek dělitele určíme hashovací funkcí jednoznačné číslo <0,..,N) Pro každý řádek dělence zkontrolujeme, zda hodnota sloupců D padne mezi 0,..,N – Pokud ano, přidáme Q do kandidátů na shodu – Pokud tam již je, nastavíme i-tý bit shody na 1 Kde i je hodnota sloupců D v naší hashovací funkci
Hashovací funkce II Transponovaný případ předchozího přístupu Hashovací funkce zpracovává Q sloupce U každého řádku z dělitele si držím bitmapu, která z hodnot sloupců Q se mi vyskytla Po projetí celého dělence aplikuji operaci AND na bitmapy a na výstup dám ty kandidáty, kde je jedna na příslušném místě v bitmapě
Hashovací funkce III (HDQ) Potřebujeme mít setříděný dělenec podle Q Máme tolik bitů, kolik je velikost dělitele Procházíme řádky skupiny, v případě shody(v hashovací funkci) s dělitelem příslušný bit nastavíme na jedna Když jsou na konci samé jedničky, dáme na výstup Vynulujeme bity a jdeme na další skupinu
Hashovací funkce IV (THDQ) Mám bitmapu velikosti dělitele Pro každou skupinu nejdříve vynuluji bitmapu Pro každý řádek, jehož hodnota D sloupců je v děliteli, nastavím správný bit na jedna Pokud na konci skupiny jsou všechny bity jedna, dám sloupce Q na výstup
Souhrnný přístup Algoritmy využívající souhrnný přístup – Hnízděné cykly – Počítání a slévání – Hashovací funkce – Slévání proudů
Hnízděné cykly Pro každou řádku dělence, jejíž hodnota D sloupců se nachází v děliteli – Prohledám celou tabulku dělence a spočítám počet řádek se stejnou hodnotou Q sloupců, jejichž hodnota D sloupců je v děliteli – Pokud se počet řádek shoduje s počtem řádků v děliteli, dám tento řádek na výstup
Slévání a počítání (SAP) Předpokládáme, že dělenec je setříděn podle Q sloupců Pro každou skupinu spočteme počet řádků, jejichž hodnota D sloupců je někde v děliteli Pokud se součet shoduje s počtem řádek v děliteli, dáme hodnoty Q sloupců na výstup
Hashovací funkce (HDS) Dělenec bude setříděn podle D sloupců Pro každého kandidáta máme čítač Pokud je v dané skupině obsažena hodnota Q sloupců (zjištěno pomocí hashovací funkce), zvětšíme čítač o jedna Výsledek jsou ty řádky, jejichž čítač je roven počtu řádků dělitele
Slévání proudů (SP) Dělenec setříděn podle D sloupců Máme jeden globální čítač, pro každého kandidáta jeden bit navíc Z první skupiny se stejnými D sloupci dáme hodnoty Q sloupců do tabulky s bitem nastaveným na nulu
Slévání proudů 2 Při zpracovávání dalších skupin D sloupců – Pro danou hodnotu Q sloupců nastavíme bit na 1 Po zpracovávání skupiny – Vyhodíme řádky s bitem nastaveným na nulu – Všechny ostatní nastavíme na nulu – Pokračujeme s další skupinou Na konci vyberu ty řádky, které zbyly
Srovnání algoritmů Třída 0
Srovnání algoritmů Třída 2
Srovnání algoritmů Třída 5
Srovnání algoritmů Třída 10
Duplikáty Počítací algoritmy požadují, aby se v datech nevyskytovaly duplikované řádky – Jedině slévání proudů duplikáty v dělenci nevadí Porovnávací algoritmy duplikáty ignorují
Závěr Obecná kvantifikace v databázích – Implementována jako dělení Poznali jsme – 12 druhů dat pasivně, 4 z nich aktivně, 2 přístupy k řešení – Více druhů dat v dnešní době (2002) není prozkoumáno Implementace – Není… – V SQL 1999 není možné vyjádřit přímo obecnou kvantifikaci nebo dělení