Недавно столкнулся с производительностью на одной из наших БД. Активные сессии показывали много событий с ожиданиями direct path read. Ознакомивших с множеством статей, выяснилось что именно в версии 11.2.0.3 появился механизм, отвечающий за то, когда Oracle решает большая таблица или нет и по результатам этого либо читает таблицу с диска либо из буферного кэша. Соответственно разница во времени выполнения запросов в разы отличается.
Если у вас также множество событий с ожиданием direct path read, то для начала необходимо узнать какое значение у скрытого параметра _small_table_threshold таким запросом:
Полученное значение 33138*5 = 165690 и есть количество блоков, до которых Oracle решает что таблица "маленькая", иными словами, если у вас таблица больше чем 165690 блоков, то Oracle переключается на direct path read, иначе использует кэшированное чтение (через buffer cache SGA).
Если у вас также множество событий с ожиданием direct path read, то для начала необходимо узнать какое значение у скрытого параметра _small_table_threshold таким запросом:
SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppsv y WHERE x.indx = y.indx and ksppinm LIKE '%_small_table_threshold%';
Полученное значение 33138*5 = 165690 и есть количество блоков, до которых Oracle решает что таблица "маленькая", иными словами, если у вас таблица больше чем 165690 блоков, то Oracle переключается на direct path read, иначе использует кэшированное чтение (через buffer cache SGA).
Самое простое решение:
SQL> alter system set "_small_table_threshold"=999999 scope=spfile;
System altered.
SQL> startup force
Комментариев нет:
Отправить комментарий