Я пытаюсь удостовериться, что у меня есть хорошее понимание отношения между CURSOR_SHARING, связующими переменными, привязкой переменной peeking и гистограммами, поскольку большинство источников охватывают эти темы, это разные разделы.
Хорошо, так вот, что я собрал до сих пор, не стесняйся слишком правильно, если у меня что-то не так:
CURSOR_SHARING
1. = EXACT (по умолчанию)
1.1. если оператор SQL использует литералы: оптимизатор будет генерировать новый план выполнения для каждой комбинации литералов - оптимизатор не заменит литералы связями. Для каждого литерала создается новый родительский курсор. 1.2. если оператор SQL использует переменные связывания: при первом запуске состояния оптимизатор будет заглядывать в значение переменных привязки и использовать эти конкретные значения для создания плана выполнения - все будущие операторы с этими переменными связывания будут использовать тот же план (даже если план субоптимален для других значений переменной привязки).
2. = FORCE
2,1. оптимизатор заменит все литералы связями - и в основном будет использовать тот же алгоритм, что и сценарий 1.23. = SIMILAR
3.1. нет гистограммы: оптимизатор заменяет все литералы связями → тот же конечный эффект, что и у 1.2 и 2.1 3,2. с гистограммой: optmizer заменяет все литералы связями, но заглядывает в переменную привязки КАЖДЫЙ раз, когда выполняется оператор (в отличие от только первого прогона), чтобы увидеть, существует ли более оптимальный план выполнения для этого конкретного значения привязки переменная (на основе статистики гистограммы). Поэтому новый дочерний курсор эффективно создается для каждого отдельного значения переменной связывания, с которой сталкивается оптимизатор.Вопросы:
-
С моей точки зрения, не использует CUSOR_SHARING = EXACT + запись SQL-записей с привязкой-переменными (1.2) приводит к такому же результату, что и установка CURSOR_SHARING = FORCE (2.1)? В обоих случаях оптимизатор будет только заглядывать в переменную привязки при первом запуске, чтобы сформировать план выполнения, а затем повторно использовать этот план независимо от того, какие значения переменных привязки при последующих запусках? Если да, то почему большинство источников рекомендуют использовать переменные связывания? похоже, что это может существенно повлиять на производительность.
-
Является ли гистограмма используемой в первоначальной переменной переменной привязки для 1.2 и 2.1? Как и в первом случае, когда SQL-статут запущен и оптимизатор заглядывает в переменную связывания, использует ли она гистограмму (если она есть), чтобы определить, используется ли сканирование полной таблицы или сканирование по индексу? "Oracle Database 11g, Performance Tuning Recipes", по-видимому, указывает на то, что гистограммы имеют значение только тогда, когда CURSOR_SHARING = SIMILAR, но некоторые другие источники указывают, что гистограмма используется также во всех других настройках CURSOR_SHARING.
-
В случае 1.1, будет ли оптимизатор использовать гистограмму для определения наилучшего плана выполнения? В основном я просто хочу знать, когда используется гистограмма. Это только в том случае, если CURSOR_SHARING = SIMILAR или для других настроек CURSOR_SHARING?
-
Совместное использование курсора - эта функция будет выполняться только в том случае, если есть переменные связывания (либо из пользовательского запроса, либо из системного (с помощью буквальной замены)). Поэтому это происходит только в 1.2, 2.1, 3.1 и 3.2? но поскольку SIMILAR устарел, означает ли это, что ACS происходит только в 1,2 и 2,1?
Надеюсь, я не слишком далек от базы, но если бы я допустил какие-либо ошибки, пожалуйста, исправьте меня.
Спасибо!
Отредактировано: BYS2 - 20 дек 2011 12:11 PM