Pracoval jsem na vyladění některých příkazů SQL v nově upgradované databázi z Oracle 11.2.0.4 na 12.1.0.2. Jako obvykle, rád používám SQL Developer k zobrazení plánu vysvětlení. Překvapilo mě, že jsem ve výstupu Explain Plan viděl nějaký šedý text, který můžete vidět níže.
Moje první reakce byla vyděšená a divit se, proč má Oracle jak spojení Hash Join, tak spojení Nested Loops pro spojení dvou stolů. Později v plánu vidím INDEX (FAST FULL SCAN) stejné tabulky, u které byl proveden INDEX (RANGE SCAN). Proč dva přístupy ke stejné tabulce? Co dělá Oracle 12c?
To vše je součástí nové adaptivní optimalizace dotazů 12c Optimizer. Pro tento příkaz SQL se Optimalizátor rozhodl použít počáteční plán zahrnující spojení Nested Loops. U plánu, který zahrnuje spojení Nested Loops, bude Oracle přistupovat k tabulce pomocí skenování rozsahu indexu. Optimalizátor také rozhodl, že rychlé úplné skenování indexu do spojení hash může být dalším plánem realizace, který je třeba zvážit. Před zahájením provádění příkazu SQL má Optimalizátor dva plány. Jeden plán je výchozí plán a druhý plán je adaptivní plán. Oracle bude sledovat provádění příkazu SQL při jeho zahájení s výchozím plánem. Pokud Oracle zjistí, že se jedná o nesprávný plán provádění, může přejít na adaptivní plán za běhu.
Další informace o adaptivních plánech najdete v této bílé knize od společnosti Oracle. Strany 3-5 ilustrují adaptivní plány spojení v akci.
Šedý text ve výše uvedeném plánu vysvětlení je jednoduše adaptivní plán. SQL Developer 4.1 zobrazuje výchozí plán i adaptivní plán.
Dále v plánu vysvětlení je sekce Jiné XML, kterou můžete vidět níže. Vidíme, že moje verze db je 12.1.0.2. Můžeme také typ informací, který ukazuje, že se jedná o adaptivní plán.
Všimněte si části nazvané „řádky“. Můžeme vidět každý řádek plánu Explain. Řádky, kde „skp=0“ jsou součástí výchozího plánu. Řádky, kde „skp=1“ jsou adaptivní plán, o kterém nyní víme, že se v SQL Developers zobrazuje jako šedý text.