Взаимосвязь между CURSOR_SHARING, поиском переменных связывания и гистограммами

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

Хорошо, вот то, что я собрал до сих пор, не стесняйтесь исправлять меня, если я ошибаюсь:

CURSOR_SHARING

1. = EXACT (по умолчанию)

  • 1.1. если в операторе SQL используются литералы: оптимизатор будет генерировать новый план выполнения для каждой комбинации литералов - оптимизатор не будет заменять литералы привязками. Новый родительский курсор создается для каждой комбинации букв.
  • 1.2. если в операторе SQL используются переменные привязки: при первом запуске состояния оптимизатор будет просматривать значение переменных привязки и использовать эти конкретные значения для генерации плана выполнения - все будущие операторы с этими переменными привязки будут использовать тот же план (даже если план неоптимален для других значений переменной привязки).
  • 2. = FORCE

  • 2.1. оптимизатор заменит все литералы привязками - и в основном будет использовать тот же алгоритм, что и в сценарии 1.2
  • 3. = ПОДОБНОЕ

  • 3.1. без гистограммы: оптимизатор заменяет все литералы привязками -> тот же конечный эффект, что и в 1.2 и 2.1
  • 3.2.с гистограммой: optmizer заменяет все литералы привязками, но просматривает переменную привязки КАЖДЫЙ раз при запуске оператора (а не только при первом запуске), чтобы увидеть, есть ли более оптимальный план выполнения для этого конкретного значения привязки переменная (на основе статистики гистограммы). Следовательно, новый дочерний курсор эффективно создается для каждого отдельного значения переменной связывания, с которым сталкивается оптимизатор.
  • Вопросы:

    1. Насколько я понимаю, использование CUSOR_SHARING = EXACT + запись SQL-статов с переменными связывания (1.2) не приводит к тому же результату, что и установка CURSOR_SHARING = FORCE (2.1)? В обоих случаях оптимизатор будет только просматривать переменную привязки при первом запуске, чтобы сгенерировать план выполнения, а затем повторно использовать этот план, независимо от того, какие значения переменных привязки при последующих запусках? Если да, то почему большинство источников рекомендуют использовать переменные связывания? похоже, что это может существенно повлиять на производительность.

    2. Используется ли гистограмма в начальном просмотре переменной связывания для 1.2 и 2.1? Как и в случае, когда в первый раз запускается состояние SQL и оптимизатор просматривает переменную связывания, использует ли он гистограмму (если она есть) для определения того, используется ли сканирование полной таблицы или сканирование индекса? «Oracle Database 11g, Performance Tuning Recipes», кажется, указывает на то, что гистограммы актуальны только тогда, когда CURSOR_SHARING = SIMILAR, но некоторые другие источники указывают, что гистограмма также используется во всех других настройках CURSOR_SHARING.

    3. В случае 1.1, будет ли оптимизатор использовать гистограмму для определения наилучшего плана выполнения? В основном я просто хочу знать, когда используется гистограмма. Только если CURSOR_SHARING = SIMILAR или другие настройки CURSOR_SHARING хороши?

    4. Adpative Cursor Sharing - эта функция будет иметь место только при наличии переменных связывания (либо из пользовательского запроса, либо генерируемых системой (путем буквальных замен)). Следовательно, это имеет место только в 1.2, 2.1, 3.1 и 3.2? но поскольку SIMILAR устарел,Означает ли это, что ACS появляется только в 1.2 и 2.1?

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

    Спасибо!

    Отредактировал: BYS2, 20 декабря 2011 г., 12:11

    11
    задан BYS2 20 December 2011 в 20:19
    поделиться