Obsah
Co je hash Join v Oracle?
Hash spojení se používají, když spojování velkých tabulek nebo když spojení vyžaduje většinu řádků spojených tabulek. Toto se používá pouze pro rovnoprávná spojení
Algoritmus pro Oracle Hash Join
1) Optimalizátor používá menší ze 2 tabulek k vytvoření hašovací tabulky v paměti. Malá tabulka se nazývá sestavovací tabulka
Fáze budování
Pro každý řádek v malé smyčce tabulky
Vypočítejte hodnotu hash na klíči spojení
Vložte řádek do příslušného segmentu hash.
Ukončit smyčku;
2) pak prohledá velké tabulky a porovná hodnotu hash (řádků z velké tabulky) s touto hash tabulkou, aby našel spojené řádky. Velká tabulka se nazývá probe table
Fáze sondy
Pro každý řádek ve smyčce velké tabulky
Vypočítejte hodnotu hash na klíči spojení
Vyhledejte hodnotu hash v tabulce hash
Pokud byla nalezena shoda
Vrátit řádky
Ukončit smyčku;
Výše uvedené vysvětlení je pravdivé, když se vyvíjená hashovací tabulka zcela vejde do paměti. Pokud je hashovací tabulka příliš velká na to, aby se vešla do dostupné paměti, pak Oracle provede zpracování trochu jiným způsobem.
V zásadě pokud je hashovací tabulka příliš velký na to, aby se vešel do dostupné paměti Oracle má mechanismus pro jeho ukládání na disk v dávkách (tzv. oddíly) a ukládání testovací tabulky na disk v odpovídajících dávkách, a pak moudré spojení mezi odpovídajícími dávkami
V zásadě, když se hash oblast zaplní, bude Oracle vyžadovat použití tabulkového prostoru TEMP. Oracle vybere největší oddíl s hash a zapíše to do TEMP. Oracle uchovává bitmapový index celé hashovací tabulky v paměti. Tento index pouze ví, že pro daný segment hash (umístění v tabulce hash) existuje nebo neexistuje hodnota. Index však nemá skutečnou hodnotu.
Pokud tedy řádek z druhé nebo sondovací tabulky hashuje do jednoho z těchto míst, ví se pouze to, že existuje potenciální shoda. Proces vytváření hashovací tabulky pokračuje, dokud není dokončena celá hashovací tabulka. Část hashovací tabulky je v paměti a část je na disku
Nyní Oracle začne číst sondu nebo jinou tabulku a začne vytvářet hash klíče spojení. Pokud se hash klíč shoduje s hashem v paměti, pak je spojení dokončeno a řádek je vrácen. Pokud je řádek potenciální shodou, pak Oracle uloží tento řádek v tabulkovém prostoru TEMP ve stejném schématu rozdělení, v jakém byla zachována data prvního řádku.
Jakmile je hotovo první průchod celé sekundární tabulky a jsou uvedeny všechny řádky v hašovací tabulce v paměti, Oracle začne hledat odpovídající oddíl na disku a zpracuje každý oddíl jeden po druhém a načte řádky v paměti. a zpracujte výstup
Hash join Oracle Příklad:
select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;Plan---------- ---------------------------------------ZVOLTE PROHLÁŠENÍ HASH SPOJOVACÍ PŘÍSTUP ÚPLNÝ PRÁZDNINÝ PŘÍSTUP ÚPLNÉ ODDĚLENÍJak se zpracovává hash join v Oracle
1) První EMP tabulka je naskenována a hašována
2) Dept tabulka je naskenována pro každý řádek a je vytvořen hash pro udržování spojení dept_no
3) dept_no hash je spárován v hašovací tabulce , pokud je nalezena shoda, jsou vráceny spojené řádkyNápověda pro připojení k Oracle hash
Oracle poskytl nápovědu use_hash k vynucení použití hash join.
Usageselect /* +use_hash(alias tabulky) */ ......To říká optimalizátoru, že metoda spojení, která se má použít, když je „alias_tabulky“ zdrojem dalšího řádku v pořadí spojení, by měla být hash spojení; neříká však optimalizátoru, zda má být tento zdroj řádků použit jako tabulka sestavení nebo jako testovací tabulka.
Chcete-li určit, jak se používá zdroj řádků, potřebujete druhou nápovědu:no_swap_join_inputs(“table_alias”), pokud chcete, aby Oracle použil zdroj řádků jako testovací tabulku, nebo swap_join_inputs(“table_alias”), pokud chcete, aby jej Oracle použil jako sestavu. tabulka
Některé důležité body o spojení hash v Oracle
1)Výstup výsledku hašovacího spojení není okamžitý, protože hašovací spojení je blokováno při vytváření hašovací tabulky. Jakmile je sestavení hašovací tabulky dokončeno, řádky se vracejí rychleji
2) hašovací spoje se běžně vyskytují u optimalizátoru ALL_ROWS režim, protože funguje na modelu zobrazování výsledků poté, co jsou všechny řádky alespoň jedné z tabulek hašovány v hašovací tabulce.
3)Hashovací tabulka je soukromá paměť, takže přístup k datům nevyvolává přílišnou aktivitu uchyceníCena hash Join =Náklady na čtení tabulky A + náklady na čtení tabulky B + nějaké malé zpracování v paměti
Rozdíl mezi Nested Loop a Hash Join
Hash Join | Vnořené připojení |
Hash spojení se používají, když spojování velkých tabulek nebo když spojení vyžaduje většinu řádků spojených tabulek. Toto se používá pouze pro rovnoprávná spojení | Připojení NESTED LOOPS je operace spojení, která vybere řádek z vybraného zdroje počátečních řádků a použije hodnoty tohoto zdroje řádků k najetí do nebo k výběru ze spojeného zdroje řádků při hledání shodného řádku. -Nejlepší pro transakce typu OLTP |
Operace hašování je normálně účinná pro dvě datové sady, když je vráceno velké množství záznamů. | Když jedna datová sada neobsahuje žádný nebo jen malý počet vrácených záznamů a další datovou sadu lze porovnat pomocí operace indexu, pak je spojení vnořené smyčky efektivnější |
Můžete vidět více spojení hash používaných v režimu optimalizace ALL_ROWS, protože funguje na modelu zobrazování výsledků poté, co jsou všechny řádky alespoň jedné z tabulek hašovány v tabulce hash. | Uvidíte větší využití vnořené smyčky při použití režimu optimalizace FIRST_ROWS, protože funguje na modelu zobrazování okamžitých výsledků uživateli při jejich načítání. Není třeba volit ukládání do mezipaměti, než budou vrácena uživateli. V případě hash join je to nutné a je vysvětleno níže. |