2013-09-26 2 views
1

У меня есть общий вопрос о том, что я вижу в настройке производительности в Oracle. У меня есть запрос, который я тестирую. Мне слишком сложно и сложно представить простой пример, извините! (Я попытался опустить его, но потерял симптом)Запрос Oracle медленнее во второй раз

Первый раз, когда я запускаю запрос, это 2 секунды. В последующих случаях это 3, 4 или даже 5 секунд. Это происходит последовательно - если я меняю интервал, я снова получаю 2 секунды, затем он возвращается.

Это противоположность тому, что я ожидаю - после первого использования базы данных не нужно разбирать запрос, а блоки должны считываться в буферный кеш. Единственное, о чем я могу думать, это то, что он записывает временные данные где-то, таким образом, что быстрее писать и читать, чем просто читать. Но это, конечно, не имеет смысла.

Кто-нибудь знает, почему это происходит? Или любые красные флаги в плане выполнения, которые могут вызвать что-то подобное?

FYI, это SELECT, с несколькими объединениями, агрегацией и представлениями. Нет внутреннего PL/SQL.

Спасибо

+0

Это противоположно тому, что я ожидаю. Выходит ли вывод плана объяснения от запуска до запуска? – Twelfth

+0

Я не думаю, что вы должны быть [crossposting] (http://dba.stackexchange.com/questions/50594/oracle-query-is-slower-the-second-time) это ... – mustaccio

+0

@mustaccio - Извините , Я думал, что это подходит для форума БД, но потом я увидел, сколько еще вопросов в Stackoverflow совпало с моими тегами и подумал, что мне повезло бы здесь. Кроме того, вы единственный, кто ответил, вы можете получить очки! – orbfish

ответ

1

Запросы могут производить различные планы выполнения после первого запуска из-за cardinality feedback. В 12c эта функция была переименована в statistics feedback.

Оптимизатор использует информацию о фактическом и ожидаемом количестве строк от первого запуска и использует эту информацию для улучшения второго плана выполнения. По моему опыту, это обычно хорошая функция. Но все функции оптимизатора иногда могут иметь неприятные последствия.

Существует, по крайней мере, два способа определить, используется ли обратная связь с кардинальностью. Там будет отметка в плане объяснения:

Note 
----- 
    - cardinality feedback used for this statement 

Также оператор будет отображаться в этом запросе:

select * from v$sql_shared_cursor where use_feedback_stats = 'Y'; 

Вы можете проверить оба. Когда я попытался создать пример, у запроса был use_feedback_stats = 'Y', но в пояснении не было примечания.

+0

Это выглядит как отличная возможность. Я взгляну. – orbfish

+0

Я так и не смог воспроизвести/проверить, но ваш ответ звучит хорошо - спасибо! – orbfish

Смежные вопросы