Съдържание
Какво е хеш Join в Oracle?
Хеш обединяванията се използват, когато свързването на големи таблици или когато обединяването изисква повечето от редовете на присъединените таблици. Това се използва само за равнопоставени съединения
Алгоритъм за Oracle Hash Join
1) Оптимизаторът използва по-малка от двете таблици за изграждане на хеш таблица в паметта. Малката таблица се нарича таблица за изграждане
Фаза на изграждане
За всеки ред в малък цикъл на таблица
Изчислете хеш стойността на ключа за присъединяване
Вмъкнете ред в подходяща хеш кофа.
Край на цикъла;
2) след това сканира големите таблици и сравнява хеш стойността (на редовете от голяма таблица) с тази хеш таблица, за да намери съединените редове. Голямата таблица се нарича проба таблица
Фаза на сондата
За всеки ред в цикъл на голяма таблица
Изчислете хеш стойността на ключа за присъединяване
Проверете хеш таблицата за хеш стойност
Ако е намерено съвпадение
Върнете редове
Край на цикъла;
Горното обяснение е вярно, когато хеш таблицата, която се разработва, се вписва изцяло в паметта. ако хеш таблицата е твърде голяма, за да се побере в наличната памет, тогава Oracle извършва обработката по малко по-различен начин.
По принцип, ако хеш таблицата е твърде голям, за да се побере в наличната памет Oracle има механизъм за записването му на диск на партиди (наречени дялове) и записване на таблицата на сондата на диск в съвпадащи партиди, след което извършване на съединяване мъдро между съвпадащи партиди
По принцип, когато хеш зоната се запълни, Oracle ще изисква да използва TEMP таблично пространство. Oracle ще избере най-големия дял с в хеша и ще го запише в TEMP. Oracle запазва растерно-подобен индекс на цялата хеш таблица в паметта. Този индекс знае само, че за дадена хеш кофа (местоположение в хеш таблицата) има или не е стойност. Но индексът няма действителната стойност.
Следователно, ако един ред от хешовете на втората или пробната таблица до едно от тези местоположения, единственото нещо, което се знае е, че има потенциално съвпадение. Процесът на изграждане на хеш таблицата продължава, докато цялата хеш таблица не бъде завършена. Част от хеш таблицата е в паметта и част е на диск
Сега Oracle започва да чете сондата или друга таблица и започва да създава хеша на ключа за присъединяване. Ако хеш ключът съвпада с хеша в паметта, тогава присъединяването е завършено и редът се връща. Ако редът е потенциалното съвпадение, тогава oracle ще съхрани този ред в пространството за таблици TEMP в същата схема на разделяне, както са били запазени данните от първия ред.
След като първият проход на цялата вторична таблица е направен и всички редове в хеш таблицата в паметта са дадени, Oracle ще започне да разглежда съвпадащия дял на диска и ще обработва всеки дял един по един и ще чете редовете в паметта и обработете изхода
Пример на хеш присъединяване към Oracle:
изберете /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name от emp a,dept b, където a.dept_no=b.dept_no;Plan---------- ---------------------------------------ИЗБИРАТЕ ЗАЯВЛЕНИЕHASH ОБЩЕН ДОСТЪП ПЪЛЕН ИЗПЪЛНИТЕЛЕН ДОСТЪП ПЪЛЕН ОТДЕЛпредварително>Как се обработва хеш присъединяването в Oracle
1) Първата EMP таблица е сканирана и хеширана
2) таблицата dept се сканира за всеки ред и се създава хеш за присъединяването, поддържащо dept_no
3) dept_no хешът се съпоставя в хеш таблицата , ако се намери съвпадение, се връщат съединените редовеподсказка за хеширане на oracle
Oracle предостави подсказката use_hash за принудително използване на хеш присъединяване.
Usageselect /* +use_hash(псевдоним на таблица) */ ......Това казва на оптимизатора, че методът на присъединяване, който трябва да се използва, когато „table_alias“ е следващият източник на ред в реда на присъединяване, трябва да бъде хеш присъединяване; обаче не казва на оптимизатора дали този източник на ред трябва да се използва като таблица за изграждане или таблица на сондата.
За да посочите как се използва източникът на ред, имате нужда от втори намек:no_swap_join_inputs(“table_alias”), ако искате Oracle да използва източника на ред като таблица на сондата, или swap_join_inputs(“table_alias”), ако искате Oracle да го използва като компилация таблица
Някои важни точки за хеш присъединяването в Oracle
1) Резултатът от хеш присъединяването не е мигновен, тъй като свързването на хеш е блокирано при изграждане на хеш таблица. След като изграждането на хеш таблицата приключи, редовете се връщат по-бързо
2) хеш обединяванията обикновено се виждат с оптимизатора ALL_ROWS режим, тъй като работи по модел на показване на резултати, след като всички редове на поне една от таблиците са хеширани в хеш таблицата.
3)Хеш таблицата е личната памет, така че достъпът до данни не води до много блокираща активностЦената на хеша Присъединяване =Цена на четенето на таблица A + цена на прочетената таблица B + малко обработка в паметта
Разлика между вложен цикъл и хеш присъединяване
Присъединяване на хеш | Вложено присъединяване |
Обединяването на хеш се използва, когато свързването на големи таблици или когато обединяването изисква повечето от редовете на присъединените таблици. Това се използва само за равнопоставени съединения | СЪЕДИНЯВАНЕТО НА ВЛОЖЕНИ ЛИКВИ е операция на свързване, която избира ред от избрания начален източник на ред и използва стойностите на този източник на ред, за да въвежда или избира от източника на присъединения ред, търсейки съответстващия ред. -Най-добро за транзакции от тип OLTP |
Операцията с хеширане обикновено е ефективна за двата набора от данни, когато се връщат много записи. | Когато един набор от данни няма върнати или има малък брой o записи и друг набор от данни може да бъде съпоставен с помощта на операция с индекс, тогава присъединяването на вложен цикъл е по-ефективно |
Може да видите повече хеш обединения, използвани с режима на оптимизатор ALL_ROWS, тъй като той работи на модел на показване на резултати, след като всички редове на поне една от таблиците са хеширани в хеш таблицата. | Ще видите повече използване на вложен цикъл, когато използвате режима на оптимизатор FIRST_ROWS, тъй като той работи на модел на показване на мигновени резултати на потребителя при извличането им. Няма нужда да избирате кеширане на данни, преди да бъдат върнати на потребителя. В случай на хеш присъединяване е необходимо и е обяснено по-долу. |