2015-08-20 1 views
1

Выполняю сложный запрос по схеме eBS R12 на базе Oracle DB 11G:Почему SQL-запрос может выполняться каждый раз больше времени при последующих запусках?

Для первого запуска требуется 4 секунды. Если я запустил его снова, это займет 9, следующие 30 и т. Д.

Если я добавлю «и 1 = 1», это займет 4 секунды, затем 9, 30 и так далее.

Быстрое действие заключается в том, что мы добавили случайную сгенерированную «и sometstring = somestring», и теперь результаты всегда находятся в 4 секунды.

Я никогда не сталкивался с вопросом, который будет вести себя таким образом (он должен быть противоположным или не изменять сигенификацию между исполнением). Мы протестировали его на 2 копии одного и того же БД, такое же поведение.

Как отладить его? И какая внутренняя механика может запутаться?

UPDATE 1:

EXPLAIN PLAN FOR 
(my query); 
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

точно так же, перед началом работы, что это для последующих. см. http://pastebin.com/dMsXmhtG

+1

Прочитайте файлы трассировки оракула. – OldProgrammer

+0

@OldProgrammer Очень немногие разработчики имеют доступ к операционной системе, делая трассировку трудной или невозможной для их использования. Даже если бы у них был доступ, было бы не так удобно, как использовать что-то вроде «объяснить план для ...» и «выбирать» из таблицы (dbms_xplan.display); ». Трассировка редко бывает полезной в последних версиях Oracle. –

ответ

2

Звучит так, будто вы страдаете от адаптивного обмена курсором или обратной связи по мощности. Here is an article, показывающий, как отключить их - возможно, вы можете это сделать и посмотреть, не прекратится ли проблема, а также использовать предложение @ OldProgrammer о том, как отслеживать происходящее.

Если одна из этих проблем является проблемой, вы можете предпринять необходимые шаги для исправления основной причины (например, неправильной статистики, ненужных гистограмм и т. Д.).

3

Проверьте DBMS_XPLAN.DISPLAY_CURSOR. Причиной может быть обратная связь с кардинальностью или другие адаптивные методы, используемые Oracle. Вы должны увидеть несколько дочерних курсоров, связанных с SQL_ID вашего запроса, и вы можете сравнить их планы.

Имеет ли ваш запрос связанные переменные и столбцы, используемые для фильтрации гистограмм? Это может быть другой причиной.

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