|
Программирование >> Oracle
1722 Приложение А 12 rows selected. scott@TKYTE816> exec dbms utility.analyze schema(user, compute); PL/SQL procedure successfully completed. scott@TKYTE816> select table name, num rows, last analyzed 2 from user tables; TABLE NAME NUM ROWS LAST ANAL BONUS 0 03-FEB-01 CREATE$JAVA$LOB$TABLE 58 03-FEB-01 DEPT 4 03-FEB-01 12 rows selected. Этот простой пример показывает, что оператор ANALYZE COMPUTE выполняется - столбцы NUM ROWS и LAST ANALYZED получили значения. Процедура ANALYZE SCHEMA работает в соответствии со своим названием. Если необходимо анализировать объекты с разной степенью детализации, она не поможет. Процедура применяет один и тот же метод анализа ко всем типам объектов. Например, при эксплуатации большого хранилища данных, если необходимо использовать гистограммы по определенным столбцам или наборам столбцов только в некоторых таблицах, процедуру ANALYZE SCHEMA применять нельзя. С помощью процедуры ANALYZE SCHEMA можно либо получить гистограммы для всех столбцов, либо не получить их вообще - избирательно обрабатывать столбцы нельзя. Если анализ объектов выходит за рамки элементарного, процедура ANALYZE SCHEMA не позволит его выполнить. Она подходит для небольших и средних (по объему обрабатываемых данных) приложений. Если необходимо обрабатывать большие объемы данных, имеет смысл распараллелить анализ или использовать разные опции анализа для различных таблиц. Этого процедура ANALYZE SCHEMA не обеспечивает. При использовании процедуры ANALYZE SCHEMA следует учитывать следующие особенности. Первая связана с применением процедуры ANALYZE SCHEMA к изменяющейся схеме. Вторая - с тем, какие объекты процедура ANALYZE SCHEMA не анализирует. Рассмотрим их последовательно. Применение процедуры ANALYZE SCHEMA к изменяющейся схеме Предположим, процедура ANALYZE SCHEMA выполняется в схеме SCOTT. В эту схему добавлено несколько больших таблиц, поэтому их анализ требует определенного времени. В другом сеансе вы удаляете или добавляете ряд объектов в схеме SCOTT. Удаленный объект не б]л обработан процедурой ANALYZE SCHEMA. Когда процедура попытается его проанализировать, будет выдано сбивающее с толку сообщение: scott@TKni816> exec dbms utility.analyzeschema(user, compute); BEIN dbms utility.analyzeschema(user, compute); END; Пакет DBMS UTILITY 1723 ERROR at line 1: ORA-20000: You have insufficient privileges for an object in this schema. ORA-06512: at SYS.DBMS UTILITY , line 258 ORA-06512: at line 1 Очевидно, что все необходимые привилегии есть - объект принадлежит вашей схеме. Ошибка связана с тем, что таблицы, которую процедура пытается анализировать, больше нет. Вместо того чтобы определить отсутствие таблицы, процедура предполагает, что таблица существует и пользователю просто не хватает привилегий, чтобы ее проанализировать. В этом случае можно сделать только следующее: повторно выполнить процедуру ANALYZE SCHEMA; не удалять объекты по ходу выполнения процедуры ANALYZE SCHEMA. Следует также помнить, что, если объект добавлен в схему после начала выполнения процедуры ANALYZE SCHEMA, он не будет проанализирован - процедура его не увидит. Это - не большая проблема, поскольку процедура ANALYZESCHEMA выполнится успешно. Процедура ANALYZE SCHEMA анализирует не все В процедуре ANALYZE SCHEMA есть нерешенная проблема. Она не анализирует таблицы, организованные по индексу, если в них используется дополнительный сегмент (подробнее о таблицах, организованных по индексу, и дополнительных сегментах см. в главе 6). Например, если выполнить следующий код: scott@TKYTE816> drop table t; Tabledropped. scott@TKYTE816>create table t (x int primary key, y date) 2 organization index 3 OVERFLOW TABLESPACE TOOLS 4 / Table created. scott@TKYTE816>execute dbms utility.analyze schema(SCOTT, COMPOTE) PL/SQL procedure successfully completed. scott@TKYTE816>selecttable name, num rows,last analyzed 2 from user tables 3 where table name = T; TABLE NAME NUM ROWS LAST ANAL таблица Т не будет проанализирована. Однако если не указывать конструкцию OVERFLOW: 1724 Приложение А scott@TKYTE816> drop table t; Table dropped. scott@TKYTE816> create table t (x int primary key, y date) 2 organization index Table created. scott@TKYTE816> execute dbms utility.analyze schema(SCOTT, COMPUTE) PL/SQL procedure successfully completed. scott@TKYTE816> select table name, num rows, last analyzed 2 from user tables 3 where table name = T; TABLE NAME NUM ROWS LAST ANAL T 0 03-FEB-01 таблица анализируется. Это не означает, что конструкцию OVERFLOW для таблиц, организованных по индексу, задавать не надо - просто такие таблицы анализируются отдельно, вручную. Процедура ANALYZE DATABASE Ей я посвящаю очень короткий раздел. Не используйте эту процедуру. Ее не имеет смысла использовать в базе данных любого размера. Кроме того, она имеет неприятный побочный эффект: анализирует словарь данных (объекты, принадлежащие пользователю SYS, никогда не нужно анализировать). Не используйте эту процедуру. Просто забудьте о ее существовании. Функция FORMAT ERROR STACK На первый взгляд эта функция кажется очень полезной, но на самом деле она бесполезна. Фактически FORMAT ERROR STACK - это просто менее функциональная реализация функции SQLERRM (SQL ERRor Message). Простой пример поможет вам понять, что я имею в виду: scott@TKYTE816> create or replace procedure p1 2 as 3 begin 4 raise program error; 5 end; Procedure created. scott@TKYTE816> create or replace procedure p2 2 as 3 begin 4 p1 ; 5 end;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |