Дек 232011
 

Про этот параметр писали уже много где, например, просто и толково на русском языке написано тут и тут. Причём много где утверждают, что установка данного параметра в значение FORCE или SIMILAR - априори хорошо и безвредно. В этой заметке я постараюсь разъяснить, почему это не совсем так.
Собственно, как происходит обработка запроса в режиме EXACT (приблизительно):

  1. Считается хэш текста запроса
  2. Ищется запрос с таким же хэшем в shared pool
  3. Нашли? Отлично, используем уже готовый план, если нет, то создаём новый план, т.е. выполняется hard parse

Всё быстро, просто и понятно.
А вот как обрабатывается запрос в режиме FORCE и SIMILAR:

  1. Заменяеются литералы в запросе на сгенерированные системой имена переменных связывания
  2. В случае SIMILAR производится также оценка надёжности связанной переменной
  3. Ищется похожий запрос с в shared pool
  4. Если нашли, используем уже готовый план, если нет, то создаём новый план, т.е. выполняется hard parse

Если наши приложения создают шквал одинаковых запросов с разными литералами, то установка cursor_sharing=FORCE действительно может помочь прежде всего за счёт уменьшения числа hard parses и экономии места в shared pool.
Так почему же значение по умолчанию для этого параметра всё-таки EXACT? Дело в том, что лучше всего не полагаться на механизмы анализа запросов и сразу писать их так, чтобы они были разделяемыми. Если у нас много одинаковых, но сложных запросов, отличающихся только литералами, то на их анализ и подстановку bind variables может тратиться много процессорного времени. Да, установка FORCE поможет в таком случае избежать hard parses, но soft parses будут занимать больше времени сами по себе за счёт чрезмерно сложного анализа запросов.
Вывод: установка параметра cursor_sharing в значения, отличные от EXACT - акт отчаяния (возможно, приносящий отличный результат), когда не удаётся переписать приложения, чтобы они генерировали легко разделяемые запросы.
Если система разрабатывается "с нуля", то лучше сразу разрабатывать её для настройки EXACT.

  One Response to “Параметр cursor_sharing”

  1. Весьма неплохо указать ссылочку на металинк - High SQL Version Counts - Script to determine reason(s) (Doc ID 438755.1) и на раздел AWR-отчета "SQL ordered by Version Count".
    Очень меткое выражение - "значения, отличные от EXACT - акт отчаяния ", был опыт борьбы с девелоперами, которые не хотели использовать bind:)

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)