Работих върху настройката на някои SQL изрази в наскоро обновена база данни, от Oracle 11.2.0.4 до 12.1.0.2. Както обикновено правя, обичам да използвам SQL Developer, за да видя Explain Plan. Бях изненадан да видя някакъв сив текст в изхода на Explain Plan, който можете да видите по-долу.
Първата ми реакция беше да се откача и да се чудя защо Oracle има едновременно хеш присъединяване и присъединяване на вложени цикли за свързване на две таблици. По-късно в плана виждам ИНДЕКС (БЪРЗО ПЪЛНО СКАНИРАНЕ) на същата таблица, в която е извършен ИНДЕКС (СКАНИРАНЕ НА ОБХВАТ). Защо два достъпа до една и съща таблица? Какво прави Oracle 12c?
Всичко това е част от адаптивната оптимизация на заявките на новия 12c Optimizer. За този SQL израз, оптимизаторът е решил да използва първоначален план, включващ присъединяването на вложени цикли. За плана, който включва присъединяването на вложени цикли, Oracle ще получи достъп до таблицата със сканиране на диапазона на индекса. Оптимизаторът също така реши, че бързото пълно сканиране на индекс в хеш присъединяване може да бъде друг план за изпълнение, който трябва да се разгледа. Преди да започне изпълнението на SQL израза, оптимизаторът има два плана. Един план е по подразбиране план, а другият план е адаптивният план. Oracle ще наблюдава изпълнението на SQL израза, когато започне да се изпълнява с плана по подразбиране. Ако Oracle определи, че това е грешен план за изпълнение, той може да премине към адаптивния план в движение.
За повече информация относно адаптивните планове вижте тази бяла книга от Oracle. Страници 3-5 илюстрират адаптивните планове за присъединяване в действие.
Сивият текст в Плана за обяснение по-горе е просто адаптивният план. SQL Developer 4.1 показва както плана по подразбиране, така и адаптивния план.
По-надолу в Плана за обяснение е секцията Друг XML, която може да се види по-долу. Можем да видим, че моята db версия е 12.1.0.2. Можем също така типът информация да показва, че това е адаптивен план.
Обърнете внимание на секцията, озаглавена „редове“. Можем да видим всеки ред от Плана за обяснение. Тези редове, където „skp=0“ са част от плана по подразбиране. Редовете, където „skp=1“ са адаптивният план, който сега знаем, се появява като сив текст в SQL Developers.