Я пытаюсь убедиться, что у меня есть хорошее понимание относительно отношений между CURSOR_SHARING, переменными связывания, просмотром переменных связывания и гистограммами, так как большинство источников охватывают эти темы, это разные разделы.
Хорошо, вот то, что я уже собрала, не стесняйтесь поправлять меня, если я что-то не так:
CURSOR_SHARING
1. = ТОЧНО (по умолчанию)
1,1. если оператор SQL использует литералы: оптимизатор сгенерирует новый план выполнения для каждой комбинации литералов - оптимизатор не заменит литералы связыванием. Новый родительский курсор генерируется для каждой литеральной комбинации.
1.2. если в операторе SQL используются переменные связывания: при первом запуске инструкции оптимизатор будет проверять значение переменных связывания и использовать эти конкретные значения для генерации плана выполнения - все будущие операторы с этими переменными связывания будут использовать тот же план (даже если план неоптимален для других значений переменной связывания).
2. = СИЛА
2,1. оптимизатор заменит все литералы связыванием - и будет в основном использовать тот же алгоритм, что и сценарий 1.2
3. = ПОХОЖИЕ
3,1. нет гистограммы: оптимизатор заменяет все литералы связыванием -> тот же конечный эффект, что и в 1.2 и 2.1
3,2. с гистограммой: optmizer заменяет все литералы связыванием, но просматривает переменную связывания КАЖДЫЙ раз, когда выполняется оператор (в отличие от только при первом прогоне), чтобы увидеть, существует ли более оптимальный план выполнения для этого конкретного значения привязки переменная (на основе статистики гистограммы). Следовательно, новый дочерний курсор эффективно создается для каждого отдельного значения переменной связывания, с которым сталкивается оптимизатор.
Вопросы:
Насколько я понимаю, использование CUSOR_SHARING = EXACT + запись SQL-операторов с переменными связывания (1.2) приводит к тому же результату, что и установка CURSOR_SHARING = FORCE (2.1)? В обоих случаях оптимизатор будет только смотреть на переменную связывания при первом запуске, чтобы сгенерировать план выполнения, а затем повторно использовать этот план, независимо от значений переменных связывания при последующих запусках? Если так, то почему большинство источников рекомендует использовать переменные связывания? похоже, что это может оказать существенное влияние на производительность.
Используется ли гистограмма в начальной переменной bind для 1.2 и 2.1? Например, в первый раз, когда выполняется проверка SQL и оптимизатор просматривает переменную bind, использует ли он гистограмму (если она есть), чтобы определить, используется ли сканирование полной таблицы или сканирование индекса? «Oracle Database 11g, рецепты настройки производительности», по-видимому, указывают на то, что гистограммы актуальны только тогда, когда CURSOR_SHARING = SIMILAR, но некоторые другие источники указывают, что гистограмма также используется во всех других настройках CURSOR_SHARING.
В случае 1.1 будет ли оптимизатор использовать гистограмму для определения наилучшего плана выполнения? В основном я просто хочу знать, когда используется гистограмма. Только когда CURSOR_SHARING = SIMILAR или для других настроек CURSOR_SHARING все в порядке?
Adpative Cursor Sharing - эта функция будет иметь место, только если есть переменные связывания (либо из пользовательского запроса, либо сгенерированные системой (путем замены букв)). Поэтому это имеет место только в 1.2, 2.1, 3.1 и 3.2? но поскольку SIMILAR устарела, значит ли это, что ACS встречается только в 1.2 и 2.1?
Надеюсь, сейчас я не слишком далеко от базы, но если я допустил какие-либо ошибки, пожалуйста, исправьте меня
Спасибо!
Под редакцией: BYS2 20 декабря 2011 г. 12:11