вівторок, 22 березня 2016 р.

Второй раз запрос выполняется намного дольше первого или Cardinality feedback

Недавно столкнулся с проблемой, когда запрос первый раз выполняется за 1 секунду, а второй и последующие разы за 30 секунд. Если добавить пробел или поменять регистр любой буквы в запросе, что бы oracle вновь сделал парсинг - то запрос снова выполняется за 1 секунду. Поиски привели меня к Cardinality feedback. В двух словах, это фича, которая позволяет оптимизатору учится на своих ошибках. То есть при первом выполнении делается предполагаемая оценка, а в процессе выполнения собирается реальная оценка и если они отличаются - правильная оценка сохраняется для последующего использования. В следующий раз, когда запрос выполняется, то он будет оптимизирован снова и на этот раз оптимизатор будет использовать скорректированные оценки вместо своих обычных оценок.
В моем случае это приводило к зависаниям при последующих вызовах запроса. И что бы отключить фичу можно использовать либо параметр сессии:
alter session set "_OPTIMIZER_USE_FEEDBACK"=FALSE;
либо хинт:
/*+ opt_param('_OPTIMIZER_USE_FEEDBACK','FALSE') */

 

Немає коментарів:

Дописати коментар