|
Программирование >> Oracle
Глава 11 tkyte@TKYTE816> create or replace outline my other outline 2 for category My Category 3 on select * from dual Outline created. tkyte@TKYTE816> select name, category, sql text from user outlines; МАМЕ CATEGORY SQL TEXT MY OUTLINE MY CATEGORY select * from dual MY OTHER OUTLINE My Category select * from dual Итак, имеется два шаблона. Обратите внимание, что имена категорий отличаются только регистром символов. Это две абсолютно разные категории. Этого удалось добиться, задав идентификатор в кавычках во втором операторе CREATE OUTLINE. Теперь кажется вполне допустимым для удаления указать имя категории в нижнем регистре, но, как будет показано ниже, это не сработает: tkyte@TKYTE816> exec outln pkg.drop by cat(my category); PL/SQL procedure successfully completed. tkyte@TKYTE816> select name, category, sql text from user outlines; NAME CATEGORY SQL TEXT MY OUTLINE MY CATEGORY select * from dual MY OTHER OUTLINE My Category select * from dual Остались обе категории. Дело в том, что категории с именем в нижнем регистре нет. Теперь удалим категорию с именем в верхнем регистре: tkyte@TKYTE8I6> exec outln pkg.drop by cat(MY CATEGORY) ; PL/SQL procedure successfully completed. tkyte@TKYTE816> select name, category, sql text from user outlines NAME CATEGORY SQL TEXT MY OTHER OUTLINE My Category select * from dual И, наконец, категорию с именем в смешанном регистре: tkyte@TKYTE816> exec outln pkg.drop by cat(My Category); PL/SQL procedure successfully completed. tkyte@TKYTE816> select name, category, sql text from user outlines; no rows selected Этот побочный эффект, связанный с передачей имени объекта, а не самого объекта, иногда сбивает с толку. Подобные проблемы возникают с объектами BFILE и DIRECTORY, для которых имена тоже передаются в виде строк. Я настоятельно не рекомендую использовать идентификаторы в кавычках. В долгосрочной перспективе они приводят к ошибкам, и на соответствующие объекты нельзя Стабилизация плана оптимизатора 637 сослаться, не указав кавычки. Я видел не одно инструментальное средство, не поддерживающее работу с идентификаторами в смешанном регистре. Проблема с оператором ALTER SESSION Учтите, что при отсутствии системной привилегии CREATE ANY OUTLINE, полученной непосредственно или через роль, оператор ALTER SESSION сработает без сообщений об ошибке, но шаблоны генерироваться не будут. Поэтому, если соответствующий параметр сеанса изменен, но шаблоны не генерируются, причина - в отсутствии привилегии. Необходимо получить привилегию CREATE ANY OUTLINE, непосредственно или чрез роль. Это необходимо даже в том случае, если оператор ALTER SYSTEM использовался для генерации шаблонов планов для всех сеансов. Шаблоны будут создаваться только в сеансах от имени пользователей с привилегией CREATE ANY OUTLINE. Оператор DROP USER не удаляет шаблоны Обычно при удалении пользователя с опцией CASCADE все принадлежащие ему объекты удаляются из базы данных. Хранимые шаблоны являются исключением из этого правила. Например: sys@TKYTE816> select owjner, паше from dba outlines where owwner = TKYTE; OWNER NAME TKYTE OUTLINE 1 TKYTE 0UTLINE 2 TKYTE OUTLINE 3 sys@TKYTE816> drop user tkyte cascade; User dropped. sys@TKYTE816> select owjner, name from dba outlines where owwner = TKYTE; OWNER NAME TKYTE OUTLINE 1 TKYTE 0UTLINE 2 TKYTE OUTLINE 3 Это показывает, что даже после удаления моей учетной записи шаблоны из предыдущего примера существуют и продолжают использоваться. Шаблоны и параметр CURSOR SHARING = FORCE В СУБД Oracle версии 8.1.6 появилась возможность, которую я называю автоматическая подстановка связываемых переменных . В главе 10, посвященной стратегиям и средствам настройки производительности, я подчеркивал важность применения связываемых переменных и продемонстрировал новую возможность СУБД, когда ядро сер- Глава 11 вера само переписывает запросы с константами так, чтобы в них использовались связываемые переменные. Этот режим - совместное использование курсора (cursor sharing) - имеет аномалию, проявляющуюся при работе с хранимыми шаблонами. В зависимости от того, как генерируется шаблон, будет запомнен план для запроса: либо со связываемыми переменными, либо без них. Пример поможет прояснить ситуацию. Выполним один и тот же запрос в сеансе с установленным параметром CURSOR SHARING. В одном случае мы будем генерировать шаблон с помощью оператора ЯОД, CREATE OUTLINE, а в другом - автоматически, установив соответствующий параметр сеанса с помощью оператора ALTER SESSION. Затем сравним значения в столбце SQL TEXT для полученных шаблонов: tkyte@TKYTE816> alter session set cursor sharing = force; Session altered. tkyte@TKYTE816> create or replace outline my outline 2 for category my category 3 on select * from dual where dummy = X ; Outline created. tkyte@TKYTE816> alter session set create stored outlines = true; Session altered. tkyte@TKYTE816> select * from dual where dummy = X; tkyte@TKYTE816> alter session set create stored outlines = false; Session altered. tkyte@TKYTE816> select name, category, sql text from user outlines; NAME CATEGORY SQL TEXT SYS OUTLINE 0104122003150057 DEFAULT select * from dual where dummy = :SYS B 0 MY OUTLINE MY CATEGORY select * from dual where dummy = X Как видите, сохраненные запросы существенно отличаются. Запрос, сгенерированный с помощью оператора CREATE OUTLINE, имеет в точности такой текст, как был введен. Код, соответствующий параметру CURSOR SHARING, для этого запроса не выполнялся. Текст запроса б1л сохранен буквально. Текст же запроса для неявно сгенерированного шаблона отражает результат перезаписи. Можно явно убедиться, что константа X была автоматически заменена связываемой переменной. Этот переписанный SQL-оператор б]л автоматически сохранен. В зависимости от ситуации могут пригодиться оба метода. Важно только понять, что есть существенное отличие между явно сгенерированным планом и планом, генерируемым неявно при включенном параметре CURSOR SHARING.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |