Есть ли способ исправить запрос Oracle в общий пул - PullRequest
3 голосов
/ 04 февраля 2011

У меня есть механизм отчетов, выполняющий PreparedStatements в Oracle 11, что является задачей с высокими приоритетами.

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

Я полагаю, это связано с жестким анализом, выполненным Oracle при первом вызове запроса.

Интересно, есть ли способ намека на Oracle, что этозапрос - это запрос с высоким приоритетом, который будет выполняться часто и производительность которого критична, поэтому он должен оставаться в общем пуле, несмотря ни на что?

Я знаю, что могу исправить план выполнения в Oracle 11, но я неЯ не хочу это исправлять, я хочу, чтобы Oracle все еще мог изменять его, так как система меняется, все, что я хочу, это исключить жесткий анализ запроса.

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Возможно, вам следует изменить свое «Я полагаю ...» на «Я проверял и определил ...»:)

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

1 голос
/ 04 февраля 2011

Вы можете попробовать закрепление в общем пуле, используя dbms_shared_pool.keep

Но сначала я бы позаботился о том, чтобы у вас возникла проблема старения

1 голос
/ 04 февраля 2011

Anton, если ваш запрос использует переменные связывания, он будет использован повторно. Курсор будет кэширован и до тех пор, пока он используется повторно, он будет оставаться в кэше курсора. Убедитесь, что он использует переменные связывания. Это увеличивает возможность повторного использования и масштабируемости.

Если вы не доверяете rdbms, вы можете закрепить его, используя dbms_shared_pool.keep Смотри http://psoug.org/reference/dbms_shared_pool.html

Вам нужно найти курсор, чтобы сделать это. Обычно существует другая проблема, которая должна быть исправлена.

Рональд. http://ronr.blogspot.com

...