Программирование >>  Oracle 

1 ... 198 199 200 [ 201 ] 202 203 204 ... 469


Глава 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.



1 ... 198 199 200 [ 201 ] 202 203 204 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика