УПРАВЛЕНИЕ ОБЪЕКТАМИ СХЕМЫ


ГЛАВА 8

        ----------------------------------------------------------------

        УПРАВЛЕНИЕ ОБЪЕКТАМИ СХЕМЫ



        Эта глава объясняет,  как управлять объектами  схемы: таблицами,
        индексами,  обзорами,  кластерами,  хэш-кластерами,  синонимами,
        последовательностями,   хранимыми   процедурами,   пакетами    и
        триггерами  базы  данных.   Темы  этой главы включают обсуждение
        следующих вопросов:

            *  оценивание размеров, установка параметров памяти и
               создание объектов схемы

            *  изменение и удаление объектов схемы

[Trusted]

        Замечание:  Если  вы  используете  Trusted  ORACLE, обратитесь к
        документу  Trusted  ORACLE7  Server  Administrator's  Guide  для
        дополнительной информации об  управлении объектами схемы  в этом
        окружении.






































                                         Управление объектами схемы  8-1


----------------

Указания по управлению объектами схемы

        Этот  раздел  предоставляет   указания  по  следующим   аспектам
        управления объектами схемы:

            *  контроль использования памяти, занимаемой блоками данных
            *  установка параметров памяти для сегментов объектов
            *  требования к памяти для различных типов данных


Управление использованием памяти для блоков данных
--------------------------------------------------

        Следующие секции объясняют, как использовать параметры PCTFREE и
        PCTUSED для выполнения следующих изменений:

            *  повышения производительности записи и извлечения данных
            *  уменьшения объема неиспользуемой памяти в блоках данных
            *  уменьшения количества цепочек строк между блоками данных

Специфицирование PCTFREE

        Умолчание для  PCTFREE равно  10 процентов;  вы можете  задавать
        любое целое значение от 0 до 99 включительно, пока сумма PCTFREE
        и PCTUSED не превышает 100.  (Если вы установите PCTFREE как 99,
        то ORACLE  будет помещать  в каждый  блок по  меньшей мере  одну
        строку, независимо  от размера  этой строки.   Если строки очень
        малы,  а  блоки  очень  велики,  может уместиться даже несколько
        строк.)

        Низкое значение PCTFREE имеет следующие эффекты:

            *  резервирует  меньше  места  для  обновлений  существующих
               строк таблицы

            *  позволяет более полно заполнять блок вставками

            *  может экономить  память, так  как все  данные таблицы или
               индекса  хранятся  в  меньшем  количестве  блоков (больше
               строк на один блок)

            *  увеличивает стоимость обработки, так как ORACLE  вынужден
               часть  реорганизовывать  блоки  по  мере  заполнения   их
               свободной памяти новыми или обновленными данными

            *  потенциально увеличивает стоимость обработки и  требуемую
               память,  если  обновления   строк  или  записей   индекса
               приводят к росту строк и расщеплению их между блоками

        Низкое  значение  PCTFREE  может  быть приемлемым, например, для
        редко изменяемого сегмента.

        Высокое значение PCTFREE имеет следующие эффекты:

            *  резервирует  больше  места  для  обновлений  существующих
               строк таблицы

            *  может потребовать  больше памяти  для того  же количества
               вставляемых данных (вставляет меньше строк на один блок)


8-2  Руководство администратора


            *  уменьшает  стоимость  обработки,  так  как  блоки   редко
               требуют реорганизации своей свободной памяти
            *  может улучшить производительность обновлений, потому  что
               ORACLE не должен столь часто, как прежде, строить цепочки
               для кусков строк

        Высокое значение  PCTFREE может  быть приемлемым,  например, для
        сегментов, подвергающихся частым вставкам.

        При установке PCTFREE необходимо понимать природу данных таблицы
        или индекса.  Обновления могут  приводить к росту строк.   Новые
        значения могут иметь размер, отличный от размера заменяемых  ими
        значений.  Если имеют место много обновлений, при которых размер
        данных  увеличивается,  то   PCTFREE  следует  увеличить;   если
        обновления существенно не влияют на размеры строк, PCTFREE может
        быть низким.   Ваша цель  - найти  удовлетворительный компромисс
        между  плотной  упаковкой  данных  и хорошей производительностью
        обновлений.

        PCTFREE также влияет на производительность запросов по таблицам,
        имеющим  неподтвержденные  транзакции  от  других  пользователей
        (т.е.    по    таблицам,    одновременно    обновляемым  другими
        пользователями).   Обеспечение  согласованности  по чтению может
        потребовать частой реорганизации свободной памяти в блоках, если
        свободные участки малы.

    PCTFREE для некластеризованных таблиц
        Если данные в строках некластеризованной таблицы имеют тенденцию
        к  увеличению  размера,  зарезервируйте  часть  места  для таких
        обновлений.  В противном случае обновления строк будут приводить
        к расщеплению строк между блоками.

    PCTFREE для кластеризованных таблиц
        Эти  же  соображения  применимы  для  кластеризованных   таблиц.
        Однако после того, как достигнуто значение PCTFREE, новые строки
        для ЛЮБОЙ таблицы с таким же значением ключа кластера попадают в
        новый блок данных, который сцепляется с данным ключом кластера.

    PCTFREE для индексов
        Индексы  редко  требуют   использования  свободной  памяти   при
        обновлениях индексных данных.  Поэтому для индекса обычно  можно
        устанавливать весьма  низкое значение  PCTFREE (например,  5 или
        ниже).


Специфицирование PCTUSED

        Когда свободная память в блоке данных падает до PCTFREE, в  этот
        блок не вставляются новые строки, пока процент занятой памяти не
        упадет  ниже  PCTUSED.   ORACLE  старается  удержать блок данных
        заполненным по крайней мере на PCTUSED.  Это - процент памяти  в
        блоке, свободной для данных  после вычета накладных расходов  из
        общей памяти блока.

        Умолчание для  PCTUSED равно  40 процентов;  вы можете  задавать
        любое целое значение от 0 до 99 включительно, пока сумма PCTFREE
        и PCTUSED не превышает 100.

        Низкое значение PCTUSED имеет следующие эффекты:

            *  в  среднем,  удерживает  блоки  менее  заполненными,  чем
               высокий процент PCTUSED

                                         Управление объектами схемы  8-3


            *  уменьшает стоимость обработки,  требующейся при UPDATE  и
               DELETE для  перемещения блока  в свободный  список, когда
               его занятая память падает ниже PCTUSED
            *  увеличивает неиспользуемую память в базе данных

        Высокое значение PCTUSED имеет следующие эффекты:

            *  в  среднем,  удерживает  блоки  более  заполненными,  чем
               низкий процент PCTUSED

            *  улучшает эффективность использования памяти

            *  увеличивает стоимость обработки, требующейся при UPDATE и
               DELETE

Выбор связанных значений PCTUSED и PCTFREE

        Если вы решили явно  задать значения PCTUSED и  PCTFREE, примите
        во внимание следующие соображения:

            *  Сумма PCTFREE и PCTUSED не должна превышать 100.

            *  Если  эта  сумма  меньше  100,  то идеальным компромиссом
               между    утилизацией    памяти    и   производительностью
               ввода-вывода  является  случай,  когда  сумма  PCTFREE  и
               PCTUSED отличается  от 100  на величину,  равную проценту
               памяти в  свободном блоке,  занимаемому средней  строкой.
               Например, предположим, что размер блока данных равен 2048
               байт; за  минусом 100  байт накладных  расходов это  дает
               1948  байт,  доступных  для  данных.  Если средняя строка
               требует  195  байт,  или   10%  от  1948,  то   наилучший
               компромисс даст сумма PCTFREE и PCTUSED, равная 90%.

            *  Если эта сумма равна 100, то ORACLE пытается удерживать в
               блоке не больше чем PCTFREE свободной памяти, и стоимость
               обработки будет максимальной.

            *  Фиксированные  накладные  расходы  блока  не включаются в
               вычисления PCTUSED и PCTFREE.

            *  Чем меньше разница между  100 и суммой PCTUSED  и PCTFREE
               (скажем,   при   PCTUSED=75   и   PCTFREE=20),   тем выше
               утилизация памяти, за счет некоторого повышения стоимости
               обработки.

Примеры выбора значений PCTFREE и PCTUSED

        Следующие примеры иллюстрируют подбор значений PCTFREE и PCTUSED
        при заданных сценариях.

Пример 1

        Сценарий:       Типичная  работа  включает  предложения  UPDATE,
                        которые увеличивают размеры строк.

        Установка:      PCTFREE = 20
                        PCTUSED = 40

        Объяснение:     PCTFREE   установлен   в   20,   чтобы  оставить
                        достаточно  места  для  строк, увеличивающихся в
                        размере при  обновлениях.  PCTUSED  установлен в
                        40,  чтобы  требовалось  меньше  обработки   при

8-4  Руководство администратора


                        высокой   активности   обновлений,   т.е.    для
                        улучшения производительности.

Пример 2

        Сценарий:       Типичная  работа  включает  предложения INSERT и
                        DELETE,  а  предложения  UPDATE  в  среднем   не
                        увеличивают размеры строк.

        Установка:      PCTFREE = 5
                        PCTUSED = 60

        Объяснение:     PCTFREE  установлен  в  5,  так  как большинство
                        предложений  UPDATE   не  увеличивают   размеров
                        строк.  PCTUSED установлен в 60, так что память,
                        освобождаемая   предложениями   DELETE,    скоро
                        начинает   повторно   использоваться,   так  что
                        обработка минимизируется.

Пример 3

        Сценарий:       Таблица очень  велика; поэтому  основной заботой
                        является  память.    Типичная  работа   включает
                        только-читающие транзакции.

        Установка:      PCTFREE = 5
                        PCTUSED = 90

        Объяснение:     PCTFREE установлен в  5, так предложения  UPDATE
                        используются  редко.   PCTUSED  установлен в 90,
                        так что для хранения данных используется большая
                        часть  блока.   Это  значение  PCTUSED уменьшает
                        число  блоков,  требуемое  для  размещения  всех
                        данных таблицы, сокращает среднее число  блоков,
                        просматриваемых во время  запросов, и тем  самым
                        увеличивает производительность запросов.


Установка параметров памяти
---------------------------

        Вы  можете  устанавливать  параметры  памяти для следующих типов
        структур логической памяти:

            *  табличных пространств (действуют на каждый сегмент в
               табличном пространстве)
            *  таблиц, кластеров, снимков и журналов снимков (сегментов
               данных)
            *  индексов (сегментов индексов)
            *  сегментов отката

        Каждая база  данных имеет  умалчиваемые значения  для параметров
        памяти.   Вы  можете  специфицировать  умолчания  для табличного
        пространства,  которые  перекроют  системные  умолчания и станут
        умолчаниями  для   объектов,  создаваемых   в  этом   конкретном
        табличном   пространстве;   кроме    того,   вы   можете    явно
        специфицировать     характеристики     памяти     для    каждого
        индивидуального объекта.   Параметры памяти,  которые вы  можете
        устанавливать,  перечислены   ниже,  вместе   с  их   системными
        умолчаниями.  (Некоторые  из умолчаний  зависят от  операционной
        системы; обратитесь к вашему руководству по инсталляции [IUG].)


                                         Управление объектами схемы  8-5


        INITIAL         Размер,  в  байтах,  первого  экстента,  который
                        распределяется при создании сегмента.

                        Умолчание: 5 блоков данных
                        Минимум:   2 блока данных
                        Максимум:  зависит от операционной системы

                        Хотя  системные  умолчания  приведены  в  блоках
                        данных, при  задании этого  значения используйте
                        байты.  Можно применять  сокращения K или  M для
                        обозначения   кило-   и   мегабайтов.   Заданное
                        значение   округляется   ВВЕРХ   до   ближайшего
                        кратного   размеру    блока   данных,    который
                        определяется параметром DB_BLOCK_SIZE.

                        Например, если размер  блока данных базы  данных
                        равен  2048  байт,  то  системное  умолчание для
                        параметра памяти INITIAL равно 10240 байт.  Если
                        при   создании   табличного   пространства    вы
                        специфицируете  его  параметр  INITIAL как 20000
                        (байт),  то  ORACLE  автоматически округляет это
                        значение вверх до 20480 (10 блоков данных).

        NEXT            Размер, в байтах, следующего  (инкрементального)
                        экстента, распределяемого для сегмента.   Второй
                        экстент сегмента будет равен заданному  значению
                        NEXT.   После  этого,  каждое очередное значение
                        NEXT будет  вычисляться как  предыдущее значение
                        NEXT, умноженное на (1 + PCTINCREASE/100).

                        Умолчание: 5 блоков данных
                        Минимум:   1 блок данных
                        Максимум:  зависит от операционной системы

                        Как  и  для  INITIAL,  хотя  системные умолчания
                        приведены  в  блоках  данных,  при задании этого
                        значения  используйте  байты.   Можно  применять
                        сокращения  K  или  M  для  обозначения  кило- и
                        мегабайтов.  Заданное значение округляется ВВЕРХ
                        до  ближайшего  кратного  размеру  блока данных,
                        который определяется параметром DB_BLOCK_SIZE.

        MAXEXTENTS      Общее   число   экстентов,   включая  начальный,
                        которое может быть распределено для сегмента.

                        Умолчание: зависит от размера блока данных и
                                   от операционной системы
                        Минимум:   1 (экстент)
                        Максимум:  зависит от операционной системы














8-6  Руководство администратора


        MINEXTENTS      Общее  число  экстентов,  которое  должно   быть
                        распределено для сегмента при его создании.  Это
                        позволяет распределять большое количество памяти
                        во  время   создания,  даже   если  непрерывного
                        пространства нет.

                        Умолчание: 1 (экстент)
                        Минимум:   1 (экстент)
                        Максимум:  зависит от операционной системы

                        Если MINEXTENTS больше  1, то во  время создания
                        сегмента  ему  рсапределяется  необходимое число
                        инкрементальных   экстентов,   с  использованием
                        значений INITIAL, NEXT и PCTINCREASE.

                        Замечание: Умалчиваемое  и минимальное  значения
                        MINEXTENTS для сегмента  отката всегда равно  2.
                        Вы    можете    захотеть    увеличить   значение
                        MINEXTENTS, когда  создаете сегмент  отката, или
                        если  ваша  база  данных  фрагментирована,  а вы
                        хотите гарантировать, что у вас хватит места для
                        загрузки всех данных для одной таблицы.

        PCTINCREASE     Процент,   на   который   увеличивается   каждый
                        следующий инкрементальный экстент по отношению к
                        предыдущему      инкрементальному      экстенту,
                        распределенному для сегмента.  Если  PCTINCREASE
                        равен 0, то  все инкрементальные сегменты  будут
                        одного размера.  Если  PCTINCREASE больше 0,  то
                        каждое очередное значение NEXT увеличивается  на
                        PCTINCREASE процентов.  Значение PCTINCREASE  не
                        может быть отрицательным.

                        Очередное   значение   NEXT   вычисляется    как
                        предыдущее  значение  NEXT,  умноженное  на (1 +
                        PCTINCREASE/100)   и   округленное   ВВЕРХ    до
                        ближайшего кратного размеру блока данных.

                        Умолчание: 50 (%)
                        Минимум:   0 (%)
                        Максимум:  зависит от операционной системы

                        Замечание:  Для  сегментов  отката   PCTINCREASE
                        всегда имеет нулевое значение.  Нельзя  задавать
                        PCTINCREASE для сегментов отката.

                        За  счет  корректного  применения PCTINCREASE вы
                        можете    уменьшить    фрагментацию    сегмента,
                        увеличивая размеры  инкрементальных экстентов  и
                        сокращая общее  число экстентов,  распределяемых













                                         Управление объектами схемы  8-7


                        для сегмента.   Сегмент будет  содержать меньшее
                        число экстентов большего размера, нежели большее
                        число экстентов меньшего размера.

                        Если  вы   измените  значение   PCTINCREASE  для
                        сегмента,  то  текущее  значение  NEXT для этого
                        сегмента не  изменится; ваше  изменение повлияет
                        лишь на последующие значения NEXT.

        INITRANS        Резервирует  предопределенный  объем  памяти для
                        начального  числа  записей  транзакций,  которые
                        будут одновременно обращаться к строкам в  блоке
                        данных.  Память резервируется в заголовках  всех
                        блоков данных в ассоциированном сегменте  данных
                        или индекса.  Умалчиваемое значение равно 1  для
                        таблиц  (1  *  23  байта  =  23  байта), и 2 для
                        кластеров и индексов.

        MAXTRANS        Когда    несколько    транзакций    одновременно
                        обращаются  к  строкам  одного  и  того же блока
                        данных,  для  записи  каждой  транзакции в блоке
                        распределяется память.  После исчерпания памяти,
                        зарезервированной  параметром  INITRANS,  память
                        для     дополнительных     записей    транзакций
                        распределяется из  свободной памяти  блока, если
                        возможно.    После   распределения   эта  память
                        фактически    становится    постоянной    частью
                        заголовка блока.   Параметр MAXTRANS  служит для
                        того, чтобы ограничить число записей транзакций,
                        которые могут одновременно использовать данные в
                        блоке   данных.    Этот   параметр    лимитирует
                        количество свободной памяти, которая может  быть
                        распределена  для  записей  транзакций  в  блоке
                        данных.    Умалчиваемое   значение   зависит  от
                        операционной системы  и от  размера блока,  и не
                        превышает 255;  обратитесь к  вашему руководству
                        по инсталляции [IUG].

                        Если значение MAXTRANS слишком мало, транзакции,
                        блокированные этим лимитом, должны ожидать, пока
                        другие  транзакции  завершатся  и  освободят  им
                        место  для  записей  транзакций.  Например, если
                        MAXTRANS равно 3, и блок данных уже используется
                        тремя  активными   транзакциями,  то   четвертая
                        транзакция, обратившаяся к этому же блоку, будет
                        блокирована до завершения  одной из первых  трех
                        транзакций.


Установка INITRANS и MAXTRANS

        Значения  для  записей  транзакций  для  блоков  данных таблицы,
        кластера  или  индекса  следует  устанавливать индивидуально для
        каждого объекта, основываясь на следующих критериях:









8-8  Руководство администратора


            *  памяти, которую вы хотели бы зарезервировать для  записей
               транзакций,  в  сравнении  с  памятью,  которую вы хотите
               оставить для данных в блоке

            *  количестве   одновременных   транзакций,   которые  имеют
               вероятность затрагивать  одни и  те же  данные в  блоке в
               один момент времени

        Например,  если  таблица  очень  велика,  и  к  ней одновременно
        обращается небольшое  число пользователей,  то шансы  на то, что
        несколько транзакций одновременно  потребуют доступа к  одному и
        тому же  блоку данных,  малы.  Поэтому  оба значения  INITRANS и
        MAXTRANS могут быть низкими, особенно если память в базе  данных
        является главным дефицитом.

        Альтернативно,  предположим,  что  таблица  обычно  используется
        одновременно многими пользователями.  В этом случае имеет  смысл
        рассмотреть  назначение  высокого  показателя  INITRANS   (чтобы
        избежать  накладных  расходов  на  последующее перераспределение
        свободной памяти в блоках), и установить более высокое  значение
        MAXTRANS, чтобы пользователям  не приходилось ожидать  доступа к
        необходимым блокам данных.

Установка умалчиваемых параметров памяти
для сегментов в табличном пространстве

        Умалчиваемые параметры памяти могут быть установлены для каждого
        табличного   пространства   в   базе   данных.    Эти  умолчания
        используются  тогда,  когда  в  табличном пространстве создается
        сегмент,  для  которого  явно  не  заданы параметры памяти.  См.
        "Создание дополнительных табличных пространств" на странице 7-5.

Установка параметров памяти для сегментов данных

        Вы  можете  установить  параметры  памяти  для  сегмента  данных
        некластеризованной   таблицы,   снимка   или   журнала  снимков,
        используя фразу STORAGE соответствующего предложения CREATE  или
        ALTER.

        В  случае  кластера,  вы  можете  установить  параметры для всех
        сегментов данных  в кластере  посредством фразы  STORAGE команды
        CREATE  CLUSTER  или  ALTER  CLUSTER,  но  не  в  индивидуальных
        предложениях CREATE или ALTER, создающих или изменяющих  таблицы
        или снимки в кластере.  Параметры памяти, специфицированные  при
        создании или  изменении КЛАСТЕРИЗОВАННОЙ  таблицы (или  снимка),
        игнорируются;  всегда  используются  соответствующие  параметры,
        заданные для кластера.

Установка параметров памяти для сегментов индекса

        Параметры памяти для сегмента индекса, создаваемого для  индекса
        таблицы,  можно  устанавливать  с  помощью фразы STORAGE команды
        CREATE INDEX или ALTER  INDEX.  Параметры памяти для  индексного
        сегмента,   создаваемого   для   индекса,   который    реализует
        ограничение    первичного    или    уникального    ключа,  можно
        устанавливать с  помощью фразы  ENABLE команд  CREATE TABLE  или
        ALTER TABLE, либо с помощью фразы STORAGE команды ALTER INDEX.

        Значение  PCTFREE  для  индекса  имеет  эффект лишь при создании
        индекса,  и  только  в  том  случае,  если  при создании индекса
        таблица уже содержит строки.


                                         Управление объектами схемы  8-9


Изменение значений параметров памяти

        Вы можете изменить  умалчиваемые параметры памяти  для табличных
        пространств  и  конкретные  параметры  памяти для индивидуальных
        сегментов, если  текущие значения  некорректны.  Для  табличного
        пространства можно сбросить  все умалчиваемые параметры  памяти.
        Однако  любые  изменения  коснутся  лишь новых объектов, которые
        будут создаваться в табличном пространстве.

        Нельзя  изменить  параметры  памяти  INITIAL  и  MINEXTENTS  для
        существующей  таблицы,  кластера,  индекса  или сегмента отката.
        Если для сегмента изменяется только значение NEXT, то  очередной
        инкрементальный  экстент  для  этого  сегмента  будет иметь этот
        размер  NEXT,  а  последующие  инкрементальные  экстенты   будут
        увеличиваться  на  PCTINCREASE,  как  обычно.   Если  изменяется
        только   значение   PCTINCREASE,   то   текущее   значение  NEXT
        перевычисляется по формуле:

        NEXT = NEXT * (1 + новый PCTINCREASE/100)

        Если изменяются  оба значения  NEXT и  PCTINCREASE, то следующий
        экстент  будет   иметь  (новый)   размер  NEXT,   а  последующие
        инкрементальные экстенты будут увеличиваться на PCTINCREASE, как
        обычно.

Порядок старшинства параметров памяти

        Параметры  памяти,  действующие  в  любой данный момент времени,
        определяются следующими типами предложений SQL, перечисленными в
        порядке убывания их старшинства:

        1. ALTER TABLE/CLUSTER/SNAPSHOT/SNAPSHOT LOG/INDEX/ROLLBACK
           SEGMENT
        2. CREATE TABLE/CLUSTER/SNAPSHOT/SNAPSHOT LOG/INDEX/ROLLBACK
           SEGMENT
        3. ALTER TABLESPACE
        4. CREATE TABLESPACE

        Любой  параметр  памяти,  специфицированный  на  уровне объекта,
        перекрывает соответствующую опцию, которая была  специфицирована
        на уровне табличного пространства.  Если параметр памяти явно не
        специфицирован  на  уровне  объекта,  его умалчиваемым значением
        будет аналогичный  параметр на  уровне табличного  пространства.
        Если параметр  памяти не  задан для  табличного пространства,  к
        нему  применяется  системное  умолчание  ORACLE.  Если параметры
        памяти изменяются, новые значения  будут применяться лишь к  тем
        экстентам, которые будут распределяться позже.

        Замечание:  Параметры  памяти  для  временных  сегментов  всегда
        используют  умалчиваемые  параметры  памяти,  установленные  для
        табличного пространства.

Пример параметров памяти

        Предположим, что было выполнено следующее предложение:

        CREATE TABLE test_storage
                     (. . .)
                     STORAGE (INITIAL 100K   NEXT 100K
                              MINEXTENTS 2   MAXEXTENTS 5
                              PCTINCREASE 50);


8-10  Руководство администратора


        Предположим  также,  что  параметр  инициализации  DB_BLOCK_SIZE
        установлен  в  2K.   Следующая  таблица  показывает,  как  будут
        распределены сегменты для таблицы TEST_STORAGE.  Показаны  также
        размеры  инкрементальных  сегментов,  которые  можно  увидеть  в
        столбце   NEXT   обзоров   словаря   данных   USER_SEGMENTS  или
        DBA_SEGMENTS:

        г================T===================T=========================¬
        ¦ Номер экстента ¦ Размер экстента   ¦ Значение для NEXT       ¦
        ¦----------------+-------------------+-------------------------¦
        ¦ 1              ¦ 100K (50 блоков)  ¦ 100K                    ¦
        ¦----------------+-------------------+-------------------------¦
        ¦ 2              ¦ 100K (50 блоков)  ¦ CEIL(100K * 1.5) = 150K ¦
        ¦----------------+-------------------+-------------------------¦
        ¦ 3              ¦ 150K (75 блоков)  ¦ CEIL(150K * 1.5) = 228K ¦
        ¦----------------+-------------------+-------------------------¦
        ¦ 4              ¦ 228K (114 блоков) ¦ CEIL(228K * 1.5) = 342K ¦
        ¦----------------+-------------------+-------------------------¦
        ¦ 5              ¦ 342K (171 блок)   ¦ CEIL(342K * 1.5) = 516K ¦
        L================¦===================¦=========================-

        Если  вы   измените  параметры   памяти  NEXT   или  PCTINCREASE
        предложением  ALTER  (например,  ALTER  TABLE), то заданное вами
        значение заменит текущее значение, хранящееся в словаре  данных.
        Например,  следующее  предложение  модифицирует  параметр памяти
        NEXT  таблицы  TEST_STORAGE  перед  тем, как распределить третий
        экстент этой таблице:

        ALTER TABLE test_storage STORAGE (NEXT 500K);

        Как следствие, третий сегмент при его распределении будет  иметь
        размер 500K, четвертый - (500K*1.5) = 750K, и т.д.


Использование памяти в зависимости от типа данных
-------------------------------------------------

        При создании таблиц и других структур необходимо знать,  сколько
        памяти  им  потребуется.   Каждый  тип  данных имеет собственные
        требования к памяти, как объясняется в следующих секциях.

Символьные типы данных

        Типы данных CHAR и  VARCHAR2 хранят алфавитно-цифровые данные  в
        виде строк символов  ASCII или EBCDIC,  в зависимости от  набора
        символов,  используемого  оборудованием,  на  котором   работает
        ORACLE.  Символьные  типы данных  могут также  хранить данные  в
        наборах символов,  поддерживаемых средством  национальных языков
        (NLS) ORACLE.  (См. приложение C для дополнительной информации о
        NLS и поддержке различных наборов символов.)

        Тип данных CHAR хранит строки фиксированной длины.  При создании
        таблицы со  столбцом CHAR  для этого  столбца задается  длина (в
        байтах, а не в символах) от 1 до 255 (по умолчанию 1).

        Тип данных VARCHAR2  хранит символьные строки  переменной длины.
        При  создании  таблицы  со  столбцом  VARCHAR2 для этого столбца
        задается максимальная длина (в байтах, а не в символах) от 1  до
        2000.  Для каждой строки, значение столбца VARCHAR2 записывается




                                        Управление объектами схемы  8-11


        как  поле  переменной   длины;  если  входное   значение  короче
        максимального, оно не дополняется пробелами.

Тип данных NUMBER

        Тип   данных   NUMBER   используется   для   хранения   чисел  с
        фиксированной    и    плавающей    точкой.     Возможно  хранить
        положительные числа  в интервале  от 1  x 10**-130  до 9.99..9 x
        10**125 (с точностью до 38 значащих цифр), отрицательные числа в
        интервале от -1 x 10**-130 до 9.99..9 x 10**125 (с точностью  до
        38 значащих цифр),  и ноль.  При  определении столбца NUMBER  вы
        можете указать ТОЧНОСТЬ (общее число цифр) и МАСШТАБ (число цифр
        справа от десятичной точки).  Если точность не указана,  столбец
        хранит значения так, как они задаются.  Если не указан  масштаб,
        он считается нулевым.

        ORACLE   гарантирует   переносимость   чисел   с   точностью, не
        превышающей 38 цифр.  Вы  можете указать масштаб и  не указывать
        точность:
        имя_столбца NUMBER (*, масштаб)
        В  этом  случае  поддерживаются  точность  38  цифр  и  заданный
        масштаб.

Тип данных DATE

        Тип данных DATE хранит значения в виде точек времени (т.е.  дату
        и время).  Данные дат хранятся в фиксированных полях длиной семь
        байт.

Тип данных LONG

        Столбец, описанный как  LONG, может содержать  символьную строку
        переменной  длины  до  двух  гигабайт.   Данные  типа LONG - это
        текстовые     данные,     которые     должны      соответственно
        преобразовываться при перемещении  их между различными  наборами
        символов.

Типы данных RAW и LONG RAW

        RAW эквивалентен VARCHAR2, а  LONG RAW эквивалентен LONG,  с тем
        исключением,  что  SQL*Net  (который  соединяет пользовательские
        сессии с инстанцией) и  утилиты экспорта и импорта  не выполняют
        преобразований при передаче данных  RAW или LONG RAW.  Напротив,
        SQL*Net и импорт/экспорт автоматически конвертируют данные CHAR,
        VARCHAR2 и  LONG между  набором символов  базы данных  и набором
        символов   сессии    пользователя   (установленным    параметром
        NLS_LANGUAGE  или  командой  ALTER  SESSION),  если  эти  наборы
        символов различны.
        Данные  LONG  RAW  не  могут  индексироваться, однако данные RAW
        можно индексировать.

ROWID'ы и тип данных ROWID

        Каждой строке  некластеризованной таблицы  в базе  данных ORACLE
        назначается уникальный ROWID, соответствующий физическому адресу
        данной строки (начального куска строки, если строка хранится как
        несколько   кусков,    связанных   в    цепочку).    В    случае
        кластеризованных таблиц, строки разных таблиц, если они хранятся
        в одном и том же блоке данных, могут иметь одинаковый ROWID.
        Каждая   таблица   в   базе   данных   ORACLE   внутренне  имеет
        ПСЕВДОСТОЛБЕЦ с  именем ROWID;  этот псевдостолбец  не виден при
        выдаче структуры таблицы с помощью предложения SELECT * FROM ...

8-12  Руководство администратора


        или предложения DESCRIBE в SQL*Plus.  Однако адрес каждой строки
        можно извлечь запросом SQL,  используя ключевое слово ROWID  как
        имя столбца.

        ROWID'ы используют двоичное представление физического адреса для
        каждой выбираемой строки.  При запросах из SQL*Plus или  SQL*DBA
        это  двоичное  представление  преобразуется  в шестнадцатеричное
        представление   VARCHAR2,    состоящее   из    трех   компонент:
        блок.строка.файл.  Здесь "блок" - это относительный номер  блока
        данных,  содержащего   строку,  в   файле  данных;   "строка"  -
        относительный номер строки в блоке; "файл" - номер в базе данных
        файла, содержащего строку.  ROWID, назначенный строке,  остается
        неизменным в большинстве случаев; исключения составляют  случаи,
        когда  строка  экспортируется  и  вновь импортируется (с помощью
        утилит  IMPORT  и  EXPORT),  а  также, в случае кластеризованных
        таблиц, когда  изменяются значения  столбцов, составляющих  ключ
        кластера (хотя ORACLE  поддерживает указатель при  старом ROWID,
        указывающий на новое место  строки).  Когда строка удаляется  (и
        соответствующая транзакция подтверждена), ROWID, ассоциированный
        с удаленной строкой, может  быть назначен строке, вставляемой  в
        последующей транзакции.

        Невозможно установить значение псевдостолбца ROWID в предложении
        INSERT  или  UPDATE.   Значения  ROWID  в  псевдостолбце   ROWID
        внутренне  используются  ORACLE   в  различных  операциях   (см.
        следующую секцию).  Хотя  к значениям псевдостолбца  ROWID можно
        обращаться как  к другим  столбцам таблицы  (в списках  SELECT и
        фразах  WHERE),  эти  значения  не  хранятся  в базе данных и не
        являются данными базы данных.

Тип данных MLSLABEL

        Trusted ORACLE предоставляет специальный тип данных,  называемый
        MLSLABEL.  В стандартном ORACLE также можно объявлять столбцы  с
        типом данных MLSLABEL, для совместимости с приложениями  Trusted
        ORACLE.

        Данные MLSLABEL хранятся как  метка переменной длины (от  одного
        до пяти  байт), которая  соответствует двоичной  метке в словаре
        данных.   Обзор  словаря  данных  ALL_LABELS  выдает  все метки,
        которые   когда-либо   были   помещены   в   базу   данных.  Для
        дополнительной информации обратитесь к документу Trusted ORACLE7
        Server Administrator's Guide.




















                                        Управление объектами схемы  8-13


Сводка информации о типах данных ORACLE
---------------------------------------

        Табл.8-1  суммирует  наиболее  существенную  информацию о каждом
        типе данных ORACLE.

Табл.8-1
Сводка информации о типах данных ORACLE

        г============T=====================T===========================¬
        ¦Тип данных  ¦ Описание            ¦ Длина столбца (байт)      ¦
        ¦============+=====================+===========================¦
        ¦CHAR(размер)¦ Символьные данные   ¦ Фиксирована для каждой    ¦
        ¦            ¦ фиксированной длины ¦ строки в таблице (с хвос- ¦
        ¦            ¦ с длиной "размер".  ¦ товыми пробелами); макси- ¦
        ¦            ¦                     ¦ мальный размер 255 байт,  ¦
        ¦            ¦                     ¦ умалчиваемый - 1 байт.    ¦
        ¦            ¦                     ¦ Прежде чем установить раз-¦
        ¦            ¦                     ¦ мер, проверьте ваш набор  ¦
        ¦            ¦                     ¦ символов (однобайтовый он ¦
        ¦            ¦                     ¦ или двухбайтовый?)        ¦
        ¦------------+---------------------+---------------------------¦
        ¦VARCHAR2    ¦ Символьные данные   ¦ Переменная для каждой     ¦
        ¦(размер)    ¦ переменной длины.   ¦ строки, вплоть до 2000    ¦
        ¦            ¦ Должен быть указан  ¦ байт.                     ¦
        ¦            ¦ максимальный размер.¦ Прежде чем установить раз-¦
        ¦            ¦                     ¦ мер, проверьте ваш набор  ¦
        ¦            ¦                     ¦ символов (как выше)       ¦
        ¦------------+---------------------+---------------------------¦
        ¦NUMBER(p,s) ¦ Числовые данные пе- ¦ Переменная для каждой     ¦
        ¦            ¦ ременной длины. Мак-¦ строки. Максимальная      ¦
        ¦            ¦ симальная точность  ¦ длина одного значения     ¦
        ¦            ¦ p и/или масштаб s   ¦ составляет 21 байт.       ¦
        ¦            ¦ составляют 38 цифр. ¦                           ¦
        ¦------------+---------------------+---------------------------¦
        ¦DATE        ¦ Значение даты и вре-¦ Фиксированная, 7 байт для ¦
        ¦            ¦ мени фиксированной  ¦ каждого значения.         ¦
        ¦            ¦ длины, в интервале  ¦                           ¦
        ¦            ¦ от 1 января 4712 г. ¦                           ¦
        ¦            ¦ до н.э. до 31 декаб-¦                           ¦
        ¦            ¦ ря 4712 г. н.э.     ¦                           ¦
        ¦            ¦ Умалчиваемый формат:¦                           ¦
        ¦            ¦ DD-MON-YY.          ¦                           ¦
        ¦------------+---------------------+---------------------------¦
        ¦LONG        ¦ Символьные данные   ¦ Переменная для каждой     ¦
        ¦            ¦ переменной длины.   ¦ строки, до 2G на значение.¦
        ¦------------+---------------------+---------------------------¦
        ¦RAW(размер) ¦ Двоичные данные пе- ¦ Переменная для каждой     ¦
        ¦            ¦ ременной длины. Дол-¦ строки, до 2000 байт      ¦
        ¦            ¦ жен быть указан мак-¦ на одно значение.         ¦
        ¦            ¦ симальный размер.   ¦                           ¦
        ¦------------+---------------------+---------------------------¦
        ¦LONG RAW    ¦ Двоичные данные пе- ¦ Переменная для каждой     ¦
        ¦            ¦ ременной длины.     ¦ строки, до 2G на значение.¦
        ¦------------+---------------------+---------------------------¦
        ¦ROWID       ¦ Двоичные данные     ¦ Фиксированная, 6 байт     ¦
        ¦            ¦ (адреса строк)      ¦ на каждое значение.       ¦
        ¦------------+---------------------+---------------------------¦
        ¦MLSLABEL    ¦ Двоичные данные пе- ¦ Переменная для каждой     ¦
        ¦            ¦ рем. длины, пред-   ¦ строки, от 2 до 5 байт    ¦
        ¦            ¦ ставляющие метки ОС ¦ на одно значение.         ¦
        L============¦=====================¦===========================-

8-14  Руководство администратора


----------------

Управление таблицами

        Этот раздел  объясняет, как  планировать, создавать,  изменять и
        удалять таблицы.

Указания по управлению таблицами
--------------------------------

        Используйте следующие рекомендации, чтобы максимально  облегчить
        управление таблицами.

Проектируйте таблицы, прежде чем создавать их

        Обычно за проектирование элементов приложения, включая  таблицы,
        отвечает  разработчик  приложений.   АБД  отвечает  за установку
        параметров   памяти   и   определение   кластеров   для  таблиц,
        основываясь на информации от разработчика приложений о том,  как
        работает приложение и какие типы данных оно ожидает.

        Работая вместе с разработчиком приложений, тщательно спланируйте
        каждую таблицу, так, чтобы:

            *  Таблицы были нормализованы.
            *  Каждый столбец имел надлежащий тип данных.
            *  Столбцы,  допускающие  пустые  значения,  были определены
               последними, для экономии памяти.
            *  Таблицы  были  кластеризованы,  когда  это  выгодно,  для
               экономии   памяти   и   оптимизации    производительности
               предложений SQL.

Определите, как должно использоваться место в блоках

        Специфицируя  параметры  PCTFREE  и  PCTUSED  во  время создания
        каждой таблицы, вы  можете повлиять на  эффективность утилизации
        памяти и количество пространства, резервируемого для  обновлений
        существующих  данных  в  блоках  данных сегмента данных таблицы.
        (См.  "Управление  использованием памяти  для блоков  данных" на
        странице 8-2.)

Определите параметры записей транзакций

        Специфицируя  параметры  INITRANS  и  MAXTRANS во время создания
        каждой  таблицы,  вы  можете  повлиять  на  то,  сколько   места
        первоначально и  в конечном  счете может  быть распределено  для
        записей  транзакций  в  блоках  данных  сегмента данных таблицы.
        (См.  "Установка параметров памяти" на странице 8-5.)

Определите местоположение каждой таблицы

        Имея должные привилегии и квоты табличных пространств, вы можете
        создать   новую   таблицу   в   любом   табличном  пространстве,
        находящемся   в   состоянии    онлайн.    Поэтому   вы    должны
        специфицировать опцию  TABLESPACE в  предложении CREATE  TABLES,
        чтобы  явно  указать  табличное  пространство,  в  котором будет
        храниться таблица.

        Если вы не специфицируете опцию TABLESPACE в предложении  CREATE
        TABLE,  то  таблица  создается  в  вашем  умалчиваемом табличном
        пространстве.  (См.  "Назначение квот табличных пространств"  на
        странице 11-9.)

                                        Управление объектами схемы  8-15


        Специфицируя  табличное   пространство  при   создании  таблицы,
        убедитесь,  что  вы  понимаете  все  последствия  вашего выбора.
        Путем  правильного  выбора  табличного  пространства  для каждой
        таблицы вы можете:

            *  увеличить производительность системы базы данных

            *  уменьшить время, необходимое для администрирования

        Следующие примеры показывают, как некорректный подбор места  для
        объектов схем может повлиять на базу данных:

            *  Если   объекты   пользователей   создаются   в  табличном
               пространстве SYSTEM,  то производительность  ORACLE может
               снизиться, так  как и  объекты словаря  данных, и объекты
               пользователей должны  соперничать за  одни и  те же файлы
               данных.

            *  Если таблицы, ассоциированные с приложением,  произвольно
               распределены  по  различным  табличным  пространствам, то
               может  увеличиться  время,  необходимое  для   выполнения
               административных  операций  (таких,  как  копирование   и
               восстановление) для данных этого приложения.

Оцените размер таблицы и установите параметры памяти

        Оценка размеров таблиц перед  их созданием полезна по  следующим
        причинам:

            *  Вы  можете  использовать  комбинацию  оценочных  размеров
               таблиц, вместе с оценками для индексов, сегментов  отката
               и файлов журнала, чтобы определить объем дисковой памяти,
               потребной для проектируемой базы данных.  Из этих  оценок
               вы можете вывести корректные предложения по  приобретению
               оборудования и другие решения.

            *  Вы  можете  использовать  оценочный размер индивидуальной
               таблицы для улучшения  управления памятью, которую  будет
               занимать  эта  таблица.   Во  время  создания  таблицы вы
               укажете   подходящие   параметры   памяти   и    улучшите
               производительность ввода-вывода  для приложений,  которые
               будут работать с этой таблицей.

               Например, предположим, что вы оценили максимальный размер
               таблицы  до  ее  создания.   Теперь,  если  вы установите
               параметры памяти  при создании  таблицы, для  ее сегмента
               данных будет распределено меньше экстентов, а все  данные
               таблицы  будут   храниться  в   относительно  непрерывном
               участке    дисковой    памяти;    это    уменьшит  время,
               затрачиваемое на операции ввода-вывода для этой таблицы.

        Следующая  секция  подробно  объясняет,  как  оценивать  размеры
        таблиц.  Независимо от того, оценили ли вы размер таблицы  перед
        ее  созданием,  вы  можете  явно  задавать  параметры памяти при
        создании каждой  некластеризованной таблицы.   (Кластеризованные
        таблицы   автоматически   используют   параметры   памяти своего
        кластера.)  Любой  параметр памяти,  не заданный  вами явно  при
        создании   или   изменении   таблицы,   автоматически использует
        умалчиваемое  значение  соответствующего  параметра  памяти  для
        табличного пространства, в котором находится таблица.



8-16  Руководство администратора


        Если вы  явно задаете  параметры памяти  для экстентов  сегмента
        данных таблицы, старайтесь поместить данные таблицы в  небольшое
        число  больших  экстентов,   вместо  большого  числа   маленьких
        экстентов.

Планирование для очень больших таблиц

        Большие таблицы (особенно те, которые содержат миллионы строк  и
        занимают миллионы  байт памяти)  требуют особого  планирования и
        внимания.  Если у вас есть такие таблицы, рассмотрите  следующие
        рекомендации:

        ОГРАНИЧЬТЕ ЧИСЛО ЭКСТЕНТОВ В  ТАБЛИЦЕ.  Число экстентов в  любом
        сегменте ограничивается операционной  системой и размером  блока
        данных  базы  данных.   (См.  ваше  руководство по инсталляции.)
        Например, в большинстве баз  данных с размером блока  2K сегмент
        может иметь максимум 121  экстент.  Поэтому, если таблица  будет
        очень  большой,  вы   должны  гарантировать,  что   ее  экстенты
        достаточно велики, чтобы  сегмент не превысил  допустимого числа
        экстентов.

        Замечание: Если сегмент уже имеет максимальное число экстентов и
        требует дополнительного пространства, вы должны  экспортировать,
        удалить  и  заново  создать  (или  усечь)  объект,  увеличив его
        параметры памяти, а затем  снова импортировать данные в  объект.
        Для   исключительно   больших   таблиц   эта   процедура   может
        продолжаться 14 часов или более.

        РАЗДЕЛЯЙТЕ ТАБЛИЦЫ  И ИХ  ИНДЕКСЫ.  Помещайте  индексы в  другие
        табличные  пространства,  отдельно  от  других объектов, и, если
        возможно, на отдельные диски.  Если вам когда-нибудь потребуется
        удалить  и  заново  создать  индекс  по  очень  большой  таблице
        (например, при отключении и повторном включении ограничения, или
        при пересоздании таблицы),  то индексы, изолируемые  в отдельных
        табличных  пространствах,  часто  могут  легче найти непрерывную
        память, чем индексы, создаваемые в одном пространстве с  другими
        объектами.

        РАСПРЕДЕЛЯЙТЕ  ДОСТАТОЧНО  ВРЕМЕННОЙ  ПАМЯТИ.   Если приложения,
        работающие   с   очень   большой   таблицей,   выполняют большие
        сортировки,   гарантируйте   достаточную   память   для  больших
        временных сегментов,  а также  доступ всех  пользователей к этим
        сегментам.  (Заметьте, что временные сегменты всегда  используют
        умалчиваемые   характеристики   STORAGE   для   своих  табличных
        пространств.)


Расчет памяти для некластеризованных таблиц
-------------------------------------------

        Следующая  процедура  показывает,  как  оценить  начальный объем
        памяти, требуемый для  некластеризованной таблицы в  базе данных
        ORACLE.  Относительно кластеризованных таблиц см. секцию "Расчет
        памяти для кластеров" на странице 8-43.

        Для получения окончательной оценки требуется провести  несколько
        вычислений, а  некоторые из  констант (они  отмечены звездочкой)
        зависят  от  операционной   системы.   Ваши  оценки   не  должны
        существенно  отличаться  от  фактических  значений.   По  поводу




                                        Управление объектами схемы  8-17


        возможных  значительных  отклонений  от  констант, приведенных в
        описываемой ниже процедуре,  обратитесь к вашему  руководству по
        инсталляции [IUG].

        Эта процедура  оценивает начальный  объем памяти,  требуемый для
        таблицы в  базе данных  ORACLE.  При  использовании этих  оценок
        имейте  в  виду  следующие  факторы,  которые  могут повлиять на
        точность расчетов:

            *  Память,  используемая  для   записей  транзакций  и   для
               удаленных  строк,  не  становится  доступной  немедленно,
               из-за отсроченной процедуры очистки.

            *  Хвостовые пустые значения и их байты длины не хранятся.

            *  Вставки, обновления  и удаления  строк, а  также столбцы,
               превышающие  размер  блока   данных,  могут  привести   к
               фрагментации   и   цепочкам   кусков   строк.     Поэтому
               последующие  оценки  имеют  склонность  к  занижению   по
               сравнению  с  реальными  величинами,  если   фрагментация
               существенна.

        Вычислив размер таблицы по приведенной ниже процедуре,  добавьте
        еще  10  процентов,  чтобы  получить  оценку  размера начального
        экстента для рабочей таблицы.

        Оценка размера таблицы выполняется следующими шагами:

        1. Вычислите общий размер заголовка блока.

        2. Вычислите размер свободной памяти в блоке данных.

        3. Вычислите сумму длин столбцов для средней строки.

        4. Вычислите общий размер средней строки.

        5. Вычислите среднее число строк на блок данных.

        6. Вычислите число блоков и байт, требуемое для таблицы.

        Ниже объяснен каждый из этих шагов.

Шаг 1: Вычислите общий размер заголовка блока

        Память,  требуемая  для  заголовка  блока, представляется суммой
        двух значений, вычисляемых по следующим формулам:

            заголовок, часть A = фикс.заголовок + переменный заголовок
                                                  транзакций

        Здесь:

            фикс.заголовок (*)  57 байт

            переменный (*)      23*I
            заголовок           где I - значение INITRANS для таблицы
            транзакций






8-18  Руководство администратора


            заголовок, часть B = оглавление таблиц + оглавление строк

        Здесь:

            оглавление таблиц (*)  4

            оглавление строк       2*R
                                   где R - число строк на блок
                                           (вычисляемое в шаге 5)

        Размер заголовка блока разбит  на две отдельные формулы,  потому
        что часть  A применяется  к памяти  PCTFREE, а  часть B нет; нам
        понадобится  как  суммарный  размер  заголовка,  так  и отдельно
        размер части A на шаге 2 нашей процедуры.

            общий размер заголовка = часть A + часть B

        Если INITRANS  = 1,  то мы  можем частично  разрешить предыдущие
        формулы:

            общий размер заголовка = (57 + 23) + (4 + 2R) байт
                                   = 80 + (4 + 2R) байт

Шаг 2: Вычислите размер свободной памяти в блоке данных

        Память,   резервируемая   в   каждом   блоке   для   данных    и
        специфицируемая параметром PCTFREE,  вычисляется как процент  от
        размера блока за вычетом заголовка блока:

        свободная память = (размер блока - общий размер заголовка) -
                           ((размер блока - часть A)*(PCTFREE/100))

        Размер  блока  базы  данных  устанавливается  при  создании базы
        данных; вы можете узнать его, выдав команду SQL*DBA SHOW:

            SHOW PARAMETERS db_block_size;

        Замечание: Для дополнительной информации о команде SQL*DBA  SHOW
        обратитесь к документу ORACLE7 Server Utilities User's Guide.

        Предположив, что размер блока равен 2K, а PCTFREE=10 для  данной
        некластеризованной  таблицы,  мы  получим  следующую  оценку для
        свободной памяти для новых данных в блоке:

            свободная память = (2048 - (80 + (4 + 2R)) -
                               ((2048 - 80) * (10/100) байт
                             = (1964 - 2R) - (1968 * 0.1) байт
                             = (1964 - 2R - 196) байт
                             = (1768 - 2R) байт

Шаг 3: Вычислите сумму длин столбцов для средней строки

        Вычислите  память,  требуемую   для  значений  средней   строки,
        используя следующую информацию:









                                        Управление объектами схемы  8-19


            *  число столбцов в определении таблицы

            *  тип данных каждого столбца

            *  средний размер значений для столбцов переменной длины

        Если у  вас есть  тестовое окружение,  аналогичное проектируемой
        базе  данных,  то  вы  можете  использовать SQL, чтобы вычислить
        комбинированную  длину  столбцов  для  средней строки таблицы, с
        помощью следующего запроса:

            SELECT AVG(NVL(VSIZE(col1), 0)) +
                   AVG(NVL(VSIZE(col2), 0)) +
                   ... +
                   AVG(NVL(VSIZE(colN), 0)) "SPACE OF AVG ROW"
                   FROM имя_тестовой_таблицы;

        Здесь col1, col2, ...,  colN - имена столбцов  тестовой таблицы.
        Эта  формула  предполагает,   что  столбцы,  содержащие   пустые
        значения,  на  являются  последними  в  таблице, так что для них
        принимается  длина  столбца  1.   (Длина  столбца  для   пустого
        значения в хвостовом столбце равна 0.)

        Например, предположим, что у вас есть тестовая таблица с  именем
        T, созданная следующим предложением:

            CREATE TABLE t (
              a  CHAR(10),
              b  DATE,
              c  NUMBER(10, 2));

        Чтобы определить память, требуемую для средней строки таблицы T,
        выдайте следующий запрос:

            SELECT AVG(NVL(VSIZE(A), 0)) +
                   AVG(NVL(VSIZE(B), 0)) +
                   AVG(NVL(VSIZE(C), 0)) "SPACE OF AVG ROW"
                   FROM t;

        Альтернативно,  если  тестовой  базы  данных  нет, можно оценить
        общую память  для средней  строки таблицы.   Чтобы сделать  это,
        рассмотрите тип данных каждого столбца в таблице.  Если  столбец
        имеет тип  данных фиксированной  длины, то  длина значения этого
        столбца в  каждой строке  фиксирована.  Для  столбцов переменной
        длины вы должны определить среднее значение столбца и вычислить,
        сколько памяти требуется для этого среднего значения.   Табл.8-1
        на странице 8-14 предоставляет сводку информации о типах данных,
        которую вы можете использовать как справочник.

        Например, предположим, что вы хотели бы оценить  комбинированную
        длину столбцов  для средней  строки таблицы  T, показанной выше.
        Первые  два  столбца  этой  таблицы  имеют  фиксированную длину.
        Каждая строка таблицы T требует 10 байт для значения в столбце A










8-20  Руководство администратора


        (в предположении, что используется однобайтовый набор символов),
        и 7 байт для значения в столбце B.

        Память,  требуемая  для  значений  третьего  столбца,  C,  может
        варьироваться для каждой строки в таблице, потому что тип данных
        NUMBER  имеет  переменную  длину.   Оценив  ваши  предполагаемые
        данные, вы  можете определить,  например, что  типичное значение
        этого столбца будет иметь точность 8 (масштаб не играет роли), и
        положительно.   Тогда  типичное  значение  в столбце C потребует
        приблизительно:

            средняя длина столбца C = (средняя точность/2 + 1) байт
                                    = (8/2 + 1) байт
                                    = 5 байт

        В сумме, комбинированная память, требуемая для столбцов  средней
        строки в таблице T, равна:

            D (память на среднюю строку) = (A + B + C)
                                         = (10 + 7 + 5) байт
                                         = 22 байта

Шаг 4: Вычислите общий размер средней строки

        Вы  можете  вычислить  минимальный  объем  памяти, требуемой для
        строки в некластеризованной таблице, по следующей формуле:

            байт на строку = заголовок строки + F + V + D

        где:

            заголовок строки    3 байта на строку для некластеризованной
                                таблицы.

            F                   Общее  число   байтов  длины   для  всех
                                столбцов с длинами 250 байт или  меньше.
                                На каждый  такой столбец  отводится один
                                байт длины.

            V                   Общее  число   байтов  длины   для  всех
                                столбцов с длинами  больше 250 байт  или
                                меньше.    На   каждый   такой   столбец
                                отводится 3 байта длины.

            D                   Комбинированная память для всех столбцов
                                в средней строке (из шага 3).

        Например, общий  размер средней  строки таблице  T, описанной  в
        шаге 3, составляет:

            размер средней строки табл.T = (3 + (1*3) + (3*0) + 22) байт
                                         = 28 байт

        Абсолютный минимум для размера строки некластеризованной таблицы
        равен 9  байт.  Поэтому,  если ваше  вычисленное значение общего
        размера средней строки меньше 9, используйте вместо него число 9
        в последующих расчетах.






                                        Управление объектами схемы  8-21


Шаг 5: Вычислите среднее число строк на блок данных

        После  того,  как  определен  средний  размер  строки, вы можете
        вычислить среднее число строк, умещающихся в блоке данных:

        R (средн.число строк/блок) = своб.память / средний размер строки

        Свободная  память  была  вычислена  на  шаге 2, а средний размер
        строки - на шаге 4.  Продолжая приведенный выше пример, вычислим
        среднее число строк на блок для некластеризованной таблицы T:

        R строк/блок = (1768 байт - 2R байт * строк/блок)/28 байт
        28R байт * строк/блок = 1768 байт - 2R байт * строк/блок
        30R байт * строк/блок = 1768 байт
        R = 58 строк/блок

Шаг 6: Вычислите число блоков и байт, требуемое для таблицы

        Узнав, сколько строк может поместиться в свободной памяти  блока
        данных, вы можете вычислить число блоков, требуемое для хранения
        предполагаемой таблицы:

            # блоков для таблицы = # строк / R строк/блок

        Например, если вы оцениваете размер таблицы T в 10000 строк:

            # блоков для таблицы T = 10000 строк / 58 строк/блок
                                   = 173 блока

        Чтобы вычислить это же значение в байтах, умножьте результат  на
        размер блока данных соответствующей базы данных.  Например,  при
        размере блока базы данных 2048 байт:

            #  байт для таблицы = # блоков для таблицы * 2048 байт/блок

        Продолжая пример для таблицы T:

            #  байт для таблицы T = 173 блока * 2048 байт/блок
                                  = 354304 байт (346K)

        Подводя  итоги,  не  забывайте,  что эта процедура предоставляет
        приемлемую ОЦЕНКУ размера таблицы, но не точное число блоков или
        байт.   Оценив  размер  таблицы,  вы  можете  использовать   эту
        информацию   при   специфицировании   параметра   памяти INITIAL
        (размера начального  экстента таблицы)  в вашем  соответствующем
        предложении CREATE TABLE.

Требования памяти для существующих таблиц

        После того как таблица создана и используется, память, требуемая
        для нее, обычно  выше, чем оценка,  данная в предыдущей  секции.
        Больше памяти требуется из-за метода, с помощью которого  ORACLE
        управляет свободным пространством в базе данных.


Создание таблиц
---------------

        Создавайте  таблицы   с  помощью   команды  SQL   CREATE  TABLE.
        Например,  выдавая  следующее  предложение,  пользователь  SCOTT



8-22  Руководство администратора


        создает некластеризованную таблицу с именем EMP в своей схеме  и
        сохраняет ее в табличном пространстве USERS:

        CREATE TABLE emp (
            empno          NUMBER(5) PRIMARY KEY,
            ename          VARCHAR2(15) NOT NULL,
            job            VARCHAR2(10),
            mgr            NUMBER(5),
            hiredate       DATE DEFAULT (sysdate),
            sal            NUMBER(7,2),
            comm           NUMBER(7,2),
            deptno         NUMBER(3) NOT NULL
                           CONSTRAINT dept_fkey REFERENCES dept)
            PCTFREE 10
            PCTUSED 40
            TABLESPACE users
            STORAGE (      INITIAL 50K
                           NEXT 50K
                           MAXEXTENTS 10
                           PCTINCREASE 25 );

        Заметьте,  что  на  нескольких  столбцах этой таблицы определены
        ограничения целостности, и  что некоторые характеристики  памяти
        явно специфицированы для таблицы.

Привилегии, требуемые для создания таблиц

        Чтобы  создать  новую  таблицу  в  вашей  схеме, вы должны иметь
        системную  привилегию  CREATE  TABLE.   Чтобы  создать таблицу в
        схеме другого пользователя, вы должны иметь системную привилегию
        CREATE ANY  TABLE.  Кроме  того, владелец  таблицы должен  иметь
        квоту для табличного пространства, в котором содержится таблица,
        либо системную привилегию  UNLIMITED TABLESPACE.  (Обратитесь  к
        главе 12 для дополнительной информации о системных  привилегиях,
        и к главе  11 для дополнительной  информации о квотах  табличных
        пространств.)


Изменение таблиц
----------------

        Существуют   следующие   причины,   которые   могут  потребовать
        изменения таблицы в базе данных ORACLE:

            *  чтобы добавить один или несколько новых столбцов

            *  чтобы добавить одно или несколько ограничений целостности

            *  чтобы  модифицировать  определение  существующего столбца
               (тип данных, длину, умалчиваемое значение или ограничение
               целостности NOT NULL)

            *  чтобы модифицировать параметры использования памяти блока
               данных таблицы (PCTFREE, PCTUSED)

            *  чтобы  модифицировать  характеристики  записей транзакций
               (INITRANS, MAXTRANS)

            *  чтобы модифицировать параметры памяти (NEXT,  PCTINCREASE
               и т.п.)



                                        Управление объектами схемы  8-23


            *  чтобы включить или выключить ограничения целостности  или
               триггеры, ассоциированные с таблицей

            *  чтобы удалить ограничения целостности, ассоциированные  с
               таблицей

        Вы можете  увеличить длину  существующего столбца;  вы не можете
        уменьшить ее, если в таблице уже есть строки.  Более того,  если
        вы увеличиваете  длину столбца  с типом  данных CHAR,  вы должны
        понимать,  что  эта  операция  может  потребовать  значительного
        времени  и  существенной  дополнительной  памяти,  особенно если
        таблица содержит много строк.  Причина в том, что значение  CHAR
        в каждой строке должно  быть дополнено пробелами до  новой длины
        столбца.

        Изменяя  параметры  использования  памяти  блоков данных таблицы
        (PCTFREE  и  PCTUSED),  обратите  внимание,  что  новые значения
        применяются  ко  всем  блокам  данных,  используемым   таблицей,
        включая как те, которые уже распределены для таблицы, так и  те,
        которые  будут  распределены  в  будущем.   Однако  блоки,   уже
        распределенные   таблице,   реорганизуются   не   немедленно при
        изменении параметров памяти, а по мере необходимости в  процессе
        работы.

        Изменяя  характеристики   для  записей   транзакций  в   таблице
        (INITRANS  и  MAXTRANS),  обратите  внимание, что новое значение
        INITRANS применяется лишь к блокам, которые будут распределяться
        для таблицы в  будущем, тогда как  MAXTRANS применяется ко  всем
        блокам (как текущим, так и распределяемым позже).

        Параметры памяти  INITIAL и  MAXEXTENTS не  могут быть изменены.
        Все изменения для  остальных параметров памяти  (например, NEXT,
        PCTINCREASE)  имеют  эффект  лишь  для  экстентов, которые будут
        распределяться таблице позже.  Размер очередного распределяемого
        экстента определяется текущими значениями NEXT и PCTINCREASE,  и
        не основывается на предыдущих значениях этих параметров.

        Чтобы  изменить  таблицу,  используйте  команду SQL ALTER TABLE.
        Например, следующее предложение изменяет таблицу EMP:

        ALTER TABLE emp
            PCTFREE 30
            PCTUSED 60;

        Вы должны понимать следующие последствия изменения таблицы:

            *  Если к таблице  добавляется новый столбец,  то изначально
               он пуст.  Вы можете добавить новый столбец с ограничением
               NOT NULL лишь в том  случае, если в таблице нет  ни одной
               строки.

            *  Если  обзор  или  программная  единица  PL/SQL зависят от
               базовой таблицы, то изменение этой базовой таблицы  может
               повлиять на зависимый объект.  Обратитесь к странице 8-75
               для  информации  о  том,  как  ORACLE  управляет   такими
               зависимостями.







8-24  Руководство администратора


Привилегии, требуемые для изменения таблиц

        Чтобы  изменить  таблицу,  либо  она  должна содержаться в вашей
        схеме, либо вы должны иметь объектную привилегию ALTER для  этой
        таблицы, или системную привилегию ALTER ANY TABLE.

Распределение памяти для таблицы вручную
----------------------------------------

        ORACLE  динамически  распределяет  дополнительные  экстенты  для
        сегмента  данных  таблицы  при  необходимости.  Однако вы можете
        захотеть явно распределить  для таблицы дополнительный  экстент.
        Например, в среде  параллельного сервера ORACLE  экстент таблицы
        может быть явно распределен для конкретной инстанции.

        Новый экстент можно распределить  для таблицы с помощью  команды
        SQL ALTER  TABLE с  опцией ALLOCATE  EXTENT.  Для дополнительной
        информации об  этом параметре  команды ALTER  TABLE обратитесь к
        документу ORACLE7 Parallel Server Administrator's Guide.

Удаление таблиц
---------------

        Чтобы  удалить  ненужную  таблицу,  используйте команду SQL DROP
        TABLE.  Например, следующее предложение удаляет таблицу EMP:

        DROP TABLE emp;

        Если удаляемая таблица  содержит первичный или  уникальный ключ,
        на который ссылаются внешние  ключи других таблиц, то  вы можете
        одновременно с этой таблицей удалить ограничения FOREIGN KEY для
        порожденных таблиц, включив в команду DROP TABLE опцию  CASCADE,
        например:

        DROP TABLE emp CASCADE CONSTRAINTS;

        Прежде  чем  удалять  таблицу,  примите  во  внимание  следующие
        эффекты этого действия:

            *  Удаление таблицы  приводит к  удалению ее  определения из
               словаря данных.  Все строки таблицы необратимо теряются.
            *  Все индексы и триггеры, ассоциированные с таблицей, также
               удаляются.
            *  Все  обзоры  и  программные  единицы PL/SQL, зависимые от
               удаляемой     таблицы,     остаются,     но    становятся
               недействительными   (непригодными   для   использования).
               Обратитесь  к  странице  8-75  для  информации о том, как
               ORACLE управляет такими зависимостями.
            *  Все синонимы  удаленной таблицы  остаются, но  возвращают
               ошибку при обращении к ним.
            *  Все экстенты, распределенные удаляемой некластеризованной
               таблице,  возвращаются  в  свободную  память   табличного
               пространства   и   могут   использоваться   любым  другим
               объектом, требующим новых экстентов.
            *  Все  строки,  соответствующие  удаляемой кластеризованной
               таблице, удаляются из блоков кластера.


Привилегии, требуемые для удаления таблиц

        Чтобы  удалить  таблицу,  либо  она  должна  содержаться в вашей
        схеме, либо вы должны иметь системную привилегию DROP ANY TABLE.

                                        Управление объектами схемы  8-25


----------------

Управление обзорами

        Следующие секции  объясняют, как  создавать, заменять  и удалять
        обзоры, используя несколько команд SQL.

Создание обзоров
----------------

        Вы можете создавать  обзоры с помощью  команды SQL CREATE  VIEW.
        Каждый  обзор  определяется   запросом,  который  обращается   к
        таблицам,   снимкам   или   другим   обзорам;   однако   запрос,
        определяющий обзор, не  может содержать фразы  ORDER BY или  FOR
        UPDATE.   Например,  следующее  предложение  создает  обзор   по
        подмножеству данных таблицы EMP:

        CREATE VIEW sales_staff AS
            SELECT empno, ename, deptno
            FROM emp
            WHERE deptno = 10
            WITH CHECK OPTION CONSTRAINT sales_staff_cnst;

        Запрос,  определяющий  обзор  SALES_STAFF,  обращается  только к
        строкам  отдела  10.   Более  того,  благодаря CHECK OPTION этот
        обзор  создается  с  ограничением,  которое  не  позволяет путем
        предложений  INSERT  и  UPDATE,  выдаваемых  для  этого  обзора,
        получать строки,  которые запрос  не может  выбирать.  Например,
        следующее предложение INSERT успешно вставляет строку в  таблицу
        EMP через  обзор SALES_STAFF,  содержащий все  строки с  номером
        отдела 10:

        INSERT INTO sales_staff VALUES (7584, 'OSTER', 10);

        Однако  следующее  предложение  INSERT  подвергается  откату   и
        возвращает ошибку,  потому что  оно пытается  вставить строку  с
        номером  отдела  30,  которая  не  может  быть  выбрана  обзором
        SALES_STAFF:

        INSERT INTO sales_staff VALUES (7591, 'WILLIAMS', 30);

        Следующее предложение создает обзор, который соединяет данные из
        таблиц EMP и DEPT:

        CREATE VIEW division1_staff AS
            SELECT ename, job, dname
            FROM emp, dept
            WHERE emp.deptno IN (10, 30)
            AND emp.deptno = dept.deptno;

        Обзор DIVISION1_STAFF соединяет информацию из таблиц EMP и DEPT.
        Опция CHECK OPTION не специфицирована в предложении CREATE  VIEW
        для  этого  обзора;  поскольку  нельзя  вставлять  или обновлять
        строки  через  обзор,  который  определен  запросом,  содержащим
        соединение, опция CHECK OPTION здесь не имеет смысла.








8-26  Руководство администратора


Расширение определяющего запроса во время создания обзора

        В соответствии  со стандартом  ANSI/ISO, ORACLE  расширяет любое
        групповое обозначение  на верхнем  уровне определяющего  запроса
        обзора  в  список  столбцов,   и  сохраняет  в  словаре   данных
        результирующий  обзор;  все  подзапросы  остаются без изменений.
        Имена  столбцов  в  расширенном  списке  столбцов  заключаются в
        кавычки, на  тот случай,  если имена  столбцов базового  объекта
        были   изначально   определены   в   кавычках,   и  для гарантии
        синтаксической корректности запроса.  Кавычки включаются всегда,
        так как словарь данных не помнит, использовались ли кавычки  при
        спецификации  идентификатора  в  первоначальном предложении DDL,
        создававшем столбец базового объекта, и потому, что он не  может
        надежно вывести из самого  имени столбца, требуются ли  кавычки.
        Хотя  кавычки  не  обязательны,  если  имя  столбца начинается с
        прописной буквы и содержит  только прописные буквы и  цифры, они
        тем не менее безвредны в этих случаях.

        В  качестве  примера  предположим,  что  обзор  DEPT   создается
        следующим предложением:

        CREATE VIEW dept AS SELECT * FROM scott.dept;

        ORACLE  сохраняет  определяющий  запрос  обзора DEPT в следующем
        виде:
        SELECT "DEPTNO", "DNAME", "LOC" FROM scott.dept

        Замечание: ORACLE не расширяет обобщенные обозначения в обзорах,
        создаваемых с  ошибками (см.  следующую секцию).   Когда обзор в
        конце концов будет  откомпилирован без ошибок,  ORACLE выполняет
        расширение определяющего запроса.

Создание обзоров с ошибками

        Если предложение CREATE VIEW не имеет синтаксических ошибок,  то
        ORACLE может создать обзор даже в том случае, когда определяющий
        запрос  обзора  не  может  быть  выполнен; такой обзор считается
        "созданным  с  ошибками".   Например,  когда  создается   обзор,
        который   обращается    к   несуществующей    таблице   или    к
        несуществующему столбцу  таблицы, или  когда владелец  обзора не
        имеет требуемых привилегий, обзор тем не менее может быть создан
        и сохранен в словаре данных.  Однако такой обзор пока непригоден
        для использования.

        Чтобы создать обзор с  ошибками, вы должны включить  опцию FORCE
        команды CREATE VIEW:

        CREATE FORCE VIEW AS ...;

        По умолчанию (т.е. без  FORCE), обзоры с ошибками  не создаются.
        Когда создается обзор  с ошибками, ORACLE  возвращает сообщение,
        указывающее, что обзор был создан с ошибками.  Такой обзор имеет
        состояние  INVALID  (недействительный).   Если  позднее  условия
        изменятся так, что недействительный обзор сможет быть  выполнен,
        этот обзор может  быть перекомпилирован и  станет действительным
        (VALID).  См.  "Управление зависимостями  объектов" на  странице
        8-75.

Привилегии, требуемые для создания обзоров

        Чтобы   создать   обзор,   вы   должны   удовлетворять следующим
        требованиям:

                                        Управление объектами схемы  8-27


            *  Чтобы  создать  обзор  в  вашей  схеме,  вы  должны иметь
               привилегию  CREATE  VIEW;  чтобы  создать  обзор  в схеме
               другого   пользователя,   вы   должны   иметь   системную
               привилегию  CREATE  ANY  VIEW.   Обе эти привилегии могут
               быть получены вами явно или через роль.

            *  ВЛАДЕЛЕЦ обзора (т.е. владелец схемы, в которой создается
               обзор) должен обладать ЯВНО назначенными привилегиями для
               доступа  к  объектам,  на  которые  ссылается определение
               обзора; эти привилегии НЕ МОГУТ быть получены через роль.
               Кроме   того,   работоспособность   обзора   зависит   от
               привилегий  владельца   этого  обзора.    Например,  если
               владелец обзора имеет лишь привилегию INSERT для  таблицы
               SCOTT.EMP, то запрос можно использовать лишь для  вставки
               новых строк  в таблицу  EMP, но  не для  запросов по этой
               таблице и не для обновления или удаления строк в ней.

            *  Если владелец обзора  намеревается предоставить доступ  к
               этому  обзору  другим  пользователям,  он должен обладать
               объектными  привилегиями  для  базовых  объектов обзора с
               опцией GRANT OPTION, или системными привилегиями с опцией
               ADMIN OPTION.


Замена обзоров
--------------

        Если вы хотите изменить определение обзора, то обзор должен быть
        заменен; нельзя изменить определение обзора командой ALTER.   Вы
        можете заменять обзоры следующими способами:

            *  Вы можете  удалить и  заново создать  обзор.  Когда обзор
               удаляется,  все   гранты  на   соответствующие  объектные
               привилегии отзываются от ролей и от пользователей.  После
               пересоздания обзора все привилегии должны быть  назначены
               заново.

            *  Вы  можете  переопределить  обзор  с  помощью предложения
               CREATE  VIEW  с  опцией  OR  REPLACE.  Эта опция заменяет
               текущее  определение  обзора  и  не  затрагивает  текущих
               полномочий.  Например, предположим, что вы создали  обзор
               SALES_STAFF,   показанный   в   предыдущем   примере (см.
               страницу   8-26),   и   назначили   несколько   объектных
               привилегий ролям и  другим пользователям.  Однако  теперь
               вы   хотите   переопределить   обзор   SALES_STAFF, чтобы
               изменить номер отдела, заданный в фразе WHERE.  Вы можете
               заменить  текущую  версию  обзора  SALES_STAFF  с помощью
               следующего предложения:

               CREATE OR REPLACE VIEW sales_staff AS
                   SELECT empno, ename, deptno
                   FROM emp
                   WHERE deptno = 30
                   WITH CHECK OPTION CONSTRAINT sales_staff_cnst;

        Прежде  чем  заменять  обзор,  примите  во  внимание   следующие
        эффекты:






8-28  Руководство администратора


            *  Замена  обзора  лишь  заменяет  его определение в словаре
               данных.  Никакие объекты, на которые ссылается обзор,  не
               затрагиваются.

            *  Если  ограничение  в   опции  CHECK  OPTION   ранее  было
               определено, но не включается в новое определение  обзора,
               то это ограничение удаляется.

            *  Все  обзоры  и  программные  единицы PL/SQL, зависимые от
               заменяемого    обзора,    становятся    недействительными
               (непригодными для использования).  Обратитесь к  странице
               8-75 для  информации о  том, как  ORACLE управляет такими
               зависимостями.

Привилегии, требуемые для замены обзора

        Чтобы   заменить   обзор,   вы   должны   иметь  все привилегии,
        необходимые для удаления и создания обзора.


Удаление обзоров
----------------

        Удаляйте  обзор  с  помощью  команды  SQL  DROP VIEW.  Например,
        следующее предложение удаляет обзор с именем SALES_STAFF:

        DROP VIEW sales_staff;

Привилегии, требуемые для удаления обзора

        Вы  можете  удалять  любой  обзор,  содержащийся  в вашей схеме.
        Чтобы  удалить  обзор  в  схеме  другого пользователя, вы должны
        иметь системную привилегию DROP ANY VIEW.


----------------

Управление последовательностями

        Следующие секции  объясняют, как  создавать, изменять  и удалять
        последовательности с помощью команд SQL.

Создание последовательностей
----------------------------

        Создавайте  последовательность  с  помощью  команды  SQL  CREATE
        SEQUENCE.      Например,      следующая     команда      создает
        последовательность,   используемую    для   генерации    номеров
        сотрудников для столбца EMPNO таблицы EMP:

        CREATE SEQUENCE emp_sequence
            INCREMENT BY 1
            START WITH 1
            NOMAXVALUE
            NOCYCLE
            CACHE 10;

        Опция  CACHE  обеспечивает  предварительную генерацию нескольких
        номеров   последовательности   и   поддерживает   их   в  памяти
        (кэширует), так что доступ к ним ускоряется.  Когда  использован
        последний из номеров  в кэше, ORACLE  считывает в кэш  очередную
        группу номеров.

                                        Управление объектами схемы  8-29


        ORACLE  может  пропускать  номера  в последовательности, если вы
        кэшируете  их.   Например,  при  аварийном  останове   инстанции
        (скажем,  при  сбое  инстанции  или  выдаче предложения SHUTDOWN
        ABORT) номера  последовательности, которые  были кэшированы,  но
        еще  не  использованы,  будут  потеряны.   ORACLE  может   также
        пропускать  кэшируемые  номера  после  экспорта  и  импорта; для
        подробностей  обратитесь  к  документу  ORACLE7 Server Utilities
        User's Guide.

        Параллельный сервер  ORACLE создает  дополнительные эффекты  для
        кэшируемых  последовательностей;  для  дополнительной информации
        обратитесь к документу  ORACLE7 Parallel Server  Administrator's
        Guide.   О  вопросах  производительности  в связи с кэшированием
        последовательностей см. в  документе ORACLE7 Server  Application
        Developer's Guide.

Привилегии, требуемые для создания последовательностей

        Чтобы создать последовательность в своей схеме, вы должны  иметь
        системную    привилегию    CREATE    SEQUENCE;    чтобы  создать
        последовательность в схеме другого пользователя, вы должны иметь
        системную привилегию CREATE ANY SEQUENCE.


Изменение последовательностей
-----------------------------

        Вы можете изменить  последовательность, чтобы изменить  любой из
        параметров, определяющих ее поведение, за исключением начального
        номера.   Чтобы  изменить  начальную  точку  последовательности,
        удалите эту последовательность и заново создайте ее.

        Чтобы изменить последовательность, используйте команду SQL ALTER
        SEQUENCE.     Например,    следующее    предложение     изменяет
        последовательность EMP_SEQUENCE:

        ALTER SEQUENCE emp_sequence
            INCREMENT BY 10
            MAXVALUE 10000
            CYCLE
            CACHE 20;

Привилегии, требуемые для изменения последовательностей

        Чтобы изменить  последовательность, вы  должны иметь  ее в своей
        схеме, либо иметь системную привилегию ALTER ANY SEQUENCE.


Параметры инициализации, влияющие на последовательности
-------------------------------------------------------

        Параметр   инициализации   SEQUENCE_CACHE_ENTRIES  устанавливает
        число последовательностей,  которые могут  кэшироваться в  любой
        момент времени.  Если в вашей системе включен аудитинг, добавьте
        еще  одну  дополнительную  последовательность  для идентификации
        номеров аудитинга сессий.

        Если значение SEQUENCE_CACHE_ENTRIES слишком мало, ORACLE  может
        пропускать номера последовательностей, как в следующем сценарии:
        допустим,  вы  используете  пять кэшируемых последовательностей,
        кэш заполнен,  а SEQUENCE_CACHE_ENTRIES  = 4.   Если в настоящий
        момент   кэшированы   четыре   последовательности,   то    пятая

8-30  Руководство администратора


        последовательность  замещает  самую  старую последовательность в
        кэше, и  все значения  замещенной последовательности  (вплоть до
        последнего номера из тех, что были в кэше) теряются.

Удаление последовательностей
----------------------------

        Если последовательность больше не нужна, вы можете удалить ее  с
        помощью  команды   SQL  DROP   SEQUENCE.   Например,   следующее
        предложение удаляет последовательность ORDER_SEQ:
        DROP SEQUENCE order_seq;
        При  удалении  последовательности  ее  определение  удаляется из
        словаря данных.  Все  синонимы для последовательности  остаются,
        но возвращают ошибку при обращении к ним.

Привилегии, требуемые для удаления последовательностей

        Вы можете удалять любую последовательность, содержащуюся в вашей
        схеме.   Чтобы  удалить   последовательность  в  схеме   другого
        пользователя,  вы  должны  иметь  системную  привилегию DROP ANY
        SEQUENCE.

----------------

Управление синонимами

        Вы можете  создавать как  общие, так  и личные  синонимы.  ОБЩИЙ
        синоним принадлежит специальной  группе пользователей PUBLIC,  и
        доступен  любому  пользователю  в  базе  данных.  ЛИЧНЫЙ синоним
        содержится  в  схеме  конкретного  пользователя, и доступен лишь
        этому   пользователю,   а   также   тем,   кому   владелец   дал
        соответствующие гранты.

        Следующие секции объясняют, как  создавать и удалять синонимы  с
        помощью команд SQL.

Создание синонимов
------------------

        Создавайте  синоним  с  помощью  команды  SQL  CREATE   SYNONYM.
        Например, следующее предложение  создает общий синоним  с именем
        PUBLIC_EMP  по  таблице  EMP,  содержащейся в схеме пользователя
        JWARD:

        CREATE PUBLIC SYNONYM public_emp FOR jward.emp;

Привилегии, требуемые для создания синонимов

        Чтобы  создать  личный  синоним  в  своей схеме, вы должны иметь
        привилегию CREATE SYNONYM; чтобы создать личный синоним в  схеме
        другого  пользователя,  вы  должны  иметь  системную  привилегию
        CREATE ANY SYNONYM.
        Чтобы  создать   общий  синоним,   вы  должны   иметь  системную
        привилегию CREATE PUBLIC SYNONYM.

Удаление синонимов
------------------

        Чтобы  удалить  ненужный  синоним,  используйте команду SQL DROP
        SYNONYM.  При удалении личного синонима опустите ключевое  слово
        PUBLIC;  при  удалении  общего  синонима  укажите ключевое слово
        PUBLIC.

                                        Управление объектами схемы  8-31


        Например, следующее предложение удаляет личный синоним с  именем
        EMP:

        DROP SYNONYM emp;

        Следующее предложение удаляет общий синоним с именем PUBLIC_EMP:

        DROP PUBLIC SYNONYM public_emp;

        Когда вы удаляете синоним, его определение удаляется из  словаря
        данных.   Все   объекты,  ссылающиеся   на  удаленный   синоним,
        остаются,  но  становятся  недействительными.   См.  "Управление
        зависимостями объектов" на странице 8-75.

Привилегии, требуемые для удаления синонимов

        Вы можете  удалять любой  личный синоним,  содержащийся в  вашей
        схеме.    Чтобы   удалить   личный   синоним   в   схеме другого
        пользователя,  вы  должны  иметь  системную  привилегию DROP ANY
        SYNONYM.  Чтобы удалить общий синоним, вы должны иметь системную
        привилегию DROP PUBLIC SYNONYM.


----------------

Управление индексами

        Следующие секции  объясняют, как  создавать, изменять  и удалять
        индексы с  помощью команд  SQL, и  предоставляют рекомендации по
        работе с индексами.


Указания по управлению индексами
--------------------------------

        Следующие секции приводят  некоторые рекомендации по  управлению
        индексами.

        Обратитесь к  документу ORACLE7  Server Application  Developer's
        Guide для информации по вопросам производительности, связанным с
        созданием индексов.

Создавайте индексы после загрузки данных в таблицу

        Вы должны  создавать индекс  по таблице  после того,  как данные
        были вставлены или загружены в таблицу (с помощью SQL*Loader или
        импорта).  Гораздо эффективнее вставить строки данных в таблицу,
        не имеющую  индексов, а  затем создать  индексы для последующего
        доступа к этим данным.  Если вы создадите индексы перед тем, как
        загружать данные в таблицу, то при вставке каждой строки  данных
        требуется обновление всех индексов.

        В случае  индекса кластера,  вы ДОЛЖНЫ  создать индекс  кластера
        перед тем, как вставлять в кластер любые данные.

        Когда индекс  создается по  таблице, уже  имеющей данные, ORACLE
        должен использовать  область сортировки,  чтобы создать  индекс.
        ORACLE использует  область сортировки  в памяти,  распределяемой
        для  создателя  индекса  (размер  этой  области  на пользователя
        определяется   параметром   инициализации   SORT_AREA_SIZE),  но



8-32  Руководство администратора


        вынужден также обмениваться информацией сортировки с  временными
        сегментами, распределяемыми от имени процесса создания индекса.

        Если  индекс  исключительно  велик,  может  оказаться   полезным
        выполнить следующие шаги:

        1. Создать новое табличное пространство для временных сегментов.

        2. Изменить табличное пространство для временных сегментов для
           создателя индекса.

        3. Создать индекс.

        4. Удалить табличное пространство для временных сегментов и
           снова переопределить табличное пространство для временных
           сегментов для создателя индекса.

        Замечание:  При  некоторых  условиях,  можно  загрузить данные в
        таблицу,  используя  режим   SQL*Loader  "загрузки  по   прямому
        маршруту",  и  создать  индекс  по  мере  загрузки  данных;  для
        дополнительной информации обратитесь к документу ORACLE7  Server
        Utilities User's Guide.

Индексируйте корректные таблицы и столбцы

        Столбцы  LONG  и  LONG  RAW  не могут быть индексированы.  Кроме
        того,   размер   одной   записи   индекса   не   может превышать
        приблизительно одной  трети размера  блока данных.   См. "Расчет
        памяти для индексов" на странице 8-35 о том, как определить,  не
        нарушает ли индекс это ограничение.

Ограничивайте число индексов на таблицу

        Таблица может  иметь любое  число индексов.   Однако чем  больше
        индексов, тем больше накладные расходы при изменениях в таблице.
        Так,  при  вставке  и  удалении  строк должны быть обновлены все
        индексы по таблице.   Аналогично, при обновлении  столбца должны
        быть обновлены все индексы, содержащие этот столбец.

        Таким  образом,  следует   искать  компромисс  между   скоростью
        извлечения  данных  из  таблицы  и скоростью обновления таблицы.
        Например, если таблица большей  частью читается, то иметь  много
        индексов  может  быть  полезно,  однако, если таблица интенсивно
        обновляется, предпочтительнее иметь меньше индексов.

Специфицируйте параметры для входов транзакций

        Специфицируя  параметры  INITRANS  и  MAXTRANS во время создания
        каждого  индекса,  вы  можете  повлиять  на  то,  сколько  места
        первоначально и  в конечном  счете может  быть распределено  для
        записей  транзакций  в  блоках  данных  сегмента  индекса.  (См.
        "Установка параметров памяти" на странице 8-5.)

Специфицируйте использование памяти блока данных

        Когда индекс  создается по  таблице, блоки  данных этого индекса
        заполняются  существующими  в   таблице  значениями  вплоть   до
        PCTFREE.    Память,   резервируемая   в   каждом   блоке индекса
        параметром  PCTFREE,  используется  лишь  тогда, когда в таблицу
        вставляется  новая  строка,  и  соответствующая  запись  индекса
        должна  быть  помещена  в  должный  индексный  блок  (т.е. между
        предыдущей и последующей записями индекса); если в нужном  блоке

                                        Управление объектами схемы  8-33


        индекса нет  места, то  индексное значение  помещается в  другой
        блок индекса,  который соединяется  в цепочку  с головным блоком
        для  листа  индекса.   Поэтому,  если  вы планируете вставлять в
        индексированную таблицу много строк, задавайте высокое  значение
        PCTFREE,  чтобы  удовлетворить  новым  индексным значениям; если
        таблица относительно статична и в нее не будет много вставок, то
        PCTFREE для ассоциированного индекса может быть низким, так  что
        для хранения индексных данных потребуется меньше блоков.

        Замечание:  PCTUSED  нельзя  специфицировать  для индексов.  См.
        "Управление использованием памяти для блоков данных" на странице
        8-2 для информации о параметре PCTFREE.

Задавайте табличное пространство для каждого индекса

        Индексы  можно  создавать  в  любом  табличном  пространстве, не
        обязательно  в  том  же  табличном  пространстве,  где находится
        индексируемая таблица.

        Если  вы  используете  одно  и  то же табличное пространство для
        таблицы и ее  индекса, то сопровождение  базы данных может  быть
        более  удобным  (например,  в  вопросах  копирования  табличного
        пространства или файла данных, или сопровождения приложений),  и
        все связанные друг с другом данные всегда доступны вместе.

        Использование разных  табличных пространств  (на разных  дисках)
        для таблицы и  ее индекса улучшает  производительность благодаря
        уменьшению соперничества за ввод-вывод.

        Если  вы  используете  для  таблицы  и  индекса разные табличные
        пространства,  и   одно  из   них  оказывается   в  офлайне,  то
        предложения,   обращающиеся    к   таблице,    могут   оказаться
        невыполнимыми.

Оценивайте размер индекса и задавайте параметры памяти

        Причины, по которым следует  оценивать размер индекса перед  его
        созданием, те же, что и причины для оценки размеров таблиц.  См.
        секцию "Оцените размер таблицы и установите параметры памяти" на
        странице  8-16,  где  обсуждаются  эти  причины.  Секция "Расчет
        памяти для индексов" на  странице 8-35 объясняет, как  вычислять
        размеры индексов.

        Как и для таблиц, при  создании индекса вы можете явно  задавать
        параметры памяти.  Если вы явно специфицируете параметры  памяти
        при  создании  индекса,  старайтесь  разместить данные индекса в
        меньшем числе больших экстентов, вместо большего числа маленьких
        экстентов.

        Любой  параметр  памяти,  явно  не  установленный  для  индекса,
        автоматически использует  соответствующий умалчиваемый  параметр
        памяти,  который  был  установлен  для  содержащего   табличного
        пространства.  Если  вы не  специфицируете параметры  памяти при
        создании  индекса,  то  ORACLE  распределяет  экстенты сегментам
        индексов, основываясь на общем размере индекса:

            *  Если индексируемая таблица  не содержит ни  одной строки,
               то  размеры  экстентов  индекса  распределяются  согласно
               умалчиваемым параметрам памяти для содержащего табличного
               пространства.



8-34  Руководство администратора


            *  Индексу,  не  превышающему  25  блоков, распределяется по
               умолчанию один экстент.

            *  Для индексов, превышающих 25 блоков, умалчиваемые размеры
               начального и  инкрементальных экстентов  определяются как
               одна пятая общего размера индекса.

        Подробную информацию о параметрах памяти см. в секции "Параметры
        памяти" на странице 8-5.

Учитывайте индексы перед выключением или удалением ограничений

        Так как  уникальные и  первичные ключи  имеют ассоциированные  с
        ними индексы, вы должны учитывать стоимость удаления и  создания
        индексов  при  рассмотрении  вопроса  о  выключении или удалении
        ограничения UNIQUE или PRIMARY KEY. Если ассоциированный  индекс
        для ограничения UNIQUE или  PRIMARY KEY исключительно велик,  вы
        можете сэкономить  значительное время,  оставив это  ограничение
        включенным  и  избегая  удаления  и  последующего   пересоздания
        большого индекса.


Расчет памяти для индексов
--------------------------

        Следующая  процедура  демонстрирует,  как  оценивать   начальное
        количество  памяти,  требуемое   для  индекса.   Для   получения
        окончательной оценки требуется провести несколько вычислений,  а
        некоторые  из  констант  (они  отмечены  звездочкой)  зависят от
        операционной  системы.   Ваши   оценки  не  должны   существенно
        отличаться  от  фактических   значений.   По  поводу   возможных
        значительных отклонений от  констант, приведенных в  описываемой
        ниже процедуре, обратитесь  к вашему руководству  по инсталляции
        [IUG].

        Вычисления в этой процедуре опираются на средние длины столбцов,
        составляющих  индекс;  если  длины  столбцов  по строкам таблицы
        относительно постоянны по отношению к индексируемым столбцам, то
        оценки, получаемые этой процедурой, будут более точны.

        Оценка размера индекса выполняется следующими шагами:

        1. Вычислите общий размер заголовка блока.

        2. Вычислите размер свободной памяти в блоке данных.

        3. Вычислите сумму длин столбцов для среднего значения индекса.

        4. Вычислите общий размер среднего значения индекса.

        5. Вычислите число блоков и байт, требуемое для индекса.

        Ниже объяснен каждый из этих шагов.

Шаг 1: Вычислите общий размер заголовка блока

        Память,  требуемая  для  заголовка  блока, представляется суммой
        двух значений, вычисляемых по следующим формулам:

            размер заголовка = фикс.заголовок + переменный заголовок
                                                транзакций


                                        Управление объектами схемы  8-35


        Здесь:

            фикс.заголовок (*)  113 байт

            переменный (*)      23*I
            заголовок           где I - значение INITRANS для индекса
            транзакций

        Если  INITRANS  =  2  (умолчание  для  индексов),  то  мы  можем
        упростить предыдущие формулы:

            размер заголовка = 113 + (23*2) байт
                             = 159 байт

Шаг 2: Вычислите размер свободной памяти в блоке данных

        Память,  резервируемая  в  каждом  блоке  для  данных  индекса и
        специфицируемая параметром PCTFREE,  вычисляется как процент  от
        размера блока за вычетом заголовка блока:

        своб.память = (размер блока - общий размер заголовка) -
                      ((размер блока - заголовок блока)*(PCTFREE/100))

        Размер  блока  базы  данных  устанавливается  при  создании базы
        данных; вы можете узнать его, выдав команду SQL*DBA SHOW:

            SHOW PARAMETERS db_block_size;

        Замечание: Для дополнительной информации о команде SQL*DBA  SHOW
        обратитесь к документу ORACLE7 Server Utilities User's Guide.

        Предположив, что размер блока равен 2K, а PCTFREE=10 для данного
        индекса, мы  получим следующую  оценку для  свободной памяти для
        новых данных в блоке, распределенном для индекса:

            свободная память = (2048 байт - 159 байт) -
                               ((2048 - 159 байт) * (10/100))
                             = (1889 байт) - (1889 байт * 0.1)
                             = 1889 байт - 188.9 байт
                             = 1700.1 байт

Шаг 3: Вычислите сумму длин столбцов для среднего значения индекса

        Прежде чем вычислять  общий размер строки  на шаге 4,  вы должны
        вычислить  память,  требуемую  для  столбцов  среднего  значения
        индекса.  Этот  шаг идентичен  шагу 3  процедуры расчета размера
        таблицы  (страница  8-19),  с   той  разницей,  что  здесь   вам
        необходимо  вычислить  сумму  средних  длин столбцов по столбцам
        индекса.

Шаг 4: Вычислите общий размер среднего значения индекса

        Теперь вы можете вычислить  общий размер средней записи  индекса
        по следующей формуле:

            байт на строку = заголовок строки + длина ROWID + F + V + D







8-36  Руководство администратора


        где:

            заголовок строки    2 байта

            длина ROWID         6 байт

            F                   Общее  число   байтов  длины   для  всех
                                столбцов с длинами 128 байт или  меньше.
                                На каждый  такой столбец  отводится один
                                байт длины.

            V                   Общее  число   байтов  длины   для  всех
                                столбцов с длинами  больше 128 байт  или
                                меньше.    На   каждый   такой   столбец
                                отводится 3 байта длины.

            D                   Комбинированная память для всех столбцов
                                индекса (из шага 3).

        Например,  если   предположить,  что   вычисленное  значение   D
        составляет 22  байта, и  что индекс  составлен из  трех столбцов
        CHAR(10), то общий размер средней записи индекса равен:

            размер средней записи = 1 + 6 + (1 * 3) + (3 * 0) + 22 байта
                                  = 32 байта

Шаг 5: Вычислите число блоков и байт, требуемое для индекса

        Вычислите  число  блоков,  требуемое  для  хранения  индекса, по
        следующей формуле:

        # блоков для индекса =

                   # непустых строк * средний размер записи
        1.05 * ---------------------------------------------------------
                (FLOOR(своб.память/средн.разм.записи))*средн.разм.записи

        Замечание:  Дополнительные  5%  добавлены  к результату (за счет
        коэффициента 1.05),  чтобы учесть  лишнюю память,  требуемую для
        блоков ветвей индекса.

        Например, продолжим  предыдущий пример  и предположим,  что ваша
        оценка для  индексируемой таблицы  дает 10000  строк с непустыми
        значениями  столбцов,  составляющих  индекс.   В  этом случае мы
        получим:

        # блоков для индекса =

                   10000 * 32 байта
        1.05 * ----------------------------------------
                (FLOOR(1700 байт/32 байта)) * 32 байта












                                        Управление объектами схемы  8-37


        Результат будет 198 блоков.   Чтобы вычислить это же  значение в
        байтах,   умножьте    результат   на    размер   блока    данных
        соответствующей базы данных.

        Не забывайте, что эта процедура предоставляет приемлемую  ОЦЕНКУ
        размера индекса,  но не  точное число  блоков или  байт.  Оценив
        размер  индекса,  вы  можете  использовать  эту  информацию  при
        специфицировании  параметра  памяти  INITIAL (размера начального
        экстента  индекса)  в  вашем  соответствующем предложении CREATE
        INDEX.

Временная память, требуемая при создании индекса

        При создании индекса для непустой таблицы для сортировки индекса
        создаются временные  сегменты.  Величина  памяти, требуемая  для
        сортировки  индекса,  варьируется,  но  может  достигать 110% от
        размера индекса.

        Замечание:  Временная  память  не  требуется, если в предложение
        CREATE  INDEX  включена  опция  NOSORT.   Однако  вы  не  можете
        специфицировать эту опцию, когда создаете индекс кластера.


Создание индексов
-----------------

        Индекс   может   быть   создан   для   таблицы,   чтобы улучшить
        производительность  запросов,   выдаваемых  по   соответствующей
        таблице.  Индекс может также быть создан для кластера.

        ORACLE  вводит  в  действие  ограничение  целостности UNIQUE или
        PRIMARY KEY  путем создания  уникального индекса  по уникальному
        или  первичному  ключу.   Такой  индекс  автоматически создается
        ORACLE   при   включении   соответствующего   ограничения;    от
        пользователя,  выдавшего  предложение  CREATE  TABLE  или  ALTER
        TABLE, не требуется никаких действий по созданию этого  индекса.
        Это касается как определения ограничения с его включением, так и
        включения ранее определенного, но выключенного ограничения.

        Замечание:  В   общем  случае,   для  обеспечения   уникальности
        предпочтительнее   создавать   ограничения,   чем   использовать
        синтаксис  CREATE  UNIQUE  INDEX.   Индекс,  ассоциированный   с
        ограничением,  всегда  принимает  имя  этого  ограничения; вы не
        можете специфицировать отдельное имя для индекса ограничения.

        При обоих типах создания индекса  (явном и неявном), если вы  не
        специфицируете  опции  памяти  для  индекса,  они  автоматически
        устанавливаются  в  умалчиваемые  опции  памяти  для содержащего
        табличного пространства.

Создание индекса, ассоциированного с ограничением

        Вы можете установить опции памяти для индекса,  ассоциированного
        с ограничением UNIQUE или PRIMARY KEY, используя фразу ENABLE  с
        опцией USING INDEX.  Например, следующее предложение  определяет
        ограничение  PRIMARY  KEY  и  специфицирует  опции  памяти   для
        ассоциированного индекса:






8-38  Руководство администратора


        CREATE TABLE emp (
            empno NUMBER(5) PRIMARY KEY, . . . )
            ENABLE PRIMARY KEY USING INDEX
                   TABLESPACE users
                   PCTFREE 0;

Явное создание индекса

        Индексы создаются явно  (вне ограничений целостности)  с помощью
        команды  SQL  CREATE  INDEX.   Например,  следующее  предложение
        создает индекс с именем EMP_ENAME для столбца ENAME таблицы EMP:

        CREATE INDEX emp_ename ON emp(ename)
            TABLESPACE users
            STORAGE (INITIAL 20K
                     NEXT 20K
                     PCTINCREASE 75)
            PCTFREE 0;

        Заметьте, что для  этого индекса явно  специфицировано несколько
        параметров памяти.


Привилегии, требуемые для создания индексов

        Чтобы создать  новый индекс,  вы должны  владеть соответствующей
        таблицей или иметь для нее объектную привилегию INDEX.  Схема, в
        которой  создается   индекс,  должна   также  иметь   квоту  для
        табличного  пространства,  в  котором  будет содержаться индекс,
        либо системную привилегию  UNLIMITED TABLESPACE.  Чтобы  создать
        индекс в схеме другого  пользователя, вы должны иметь  системную
        привилегию CREATE ANY INDEX.

        Чтобы включить ограничение UNIQUE  или PRIMARY KEY (что  создает
        ассоциированный индекс), владельцу  таблицы требуется квота  для
        табличного  пространства,  в  котором  будет содержаться индекс,
        либо системная привилегия UNLIMITED TABLESPACE.


Изменение индекса
-----------------

        Вы  можете  изменять  индекс  лишь  для  того,  чтобы   изменить
        параметры  входов  транзакций   или  параметры  памяти;   нельзя
        изменять структуру столбцов индекса.

        Чтобы изменить параметры памяти любого индекса, включая индексы,
        созданные   ORACLE   для   реализации   ограничений  целостности
        первичного или уникального ключа, используйте команду SQL  ALTER
        INDEX.    Например,   следующее   предложение   изменяет  индекс
        EMP_ENAME:

        ALTER INDEX emp_ename
            INITRANS 5
            MAXTRANS 10
            STORAGE (PCTINCREASE 50));

        Когда вы изменяете  характеристики входов транзакций  (INITRANS,
        MAXTRANS) для индекса, новое значение INITRANS применяется  лишь
        к блокам  данных, распределяемым  впоследствии, тогда  как новое



                                        Управление объектами схемы  8-39


        значение MAXTRANS применяется ко всем блокам (уже распределенным
        и распределяемым позже) данного индекса.

        Параметры памяти  INITIAL и  MINEXTENTS не  могут быть изменены.
        Изменения для всех остальных параметров памяти действуют лишь на
        экстенты, которые будут распределяться индексу впоследствии.

        Для  индексов,  реализующих  ограничения  целостности, вы можете
        также изменить значения параметров памяти с помощью  предложения
        ALTER  TABLE,  содержащего  фразу  ENABLE  с опцией USING INDEX.
        Например,  следующее  предложение  изменяет  опцию  памяти   для
        индекса, определенного в предыдущей секции:

            ALTER TABLE emp
                ENABLE PRIMARY KEY USING INDEX
                PCTFREE 5;

Привилегии, требуемые для изменения индекса

        Чтобы изменить индекс, вы должны  либо иметь его в своей  схеме,
        либо обладать системной привилегией ALTER ANY INDEX.


Отслеживание использования памяти индексами
-------------------------------------------

        Если ключевые значения в индексе часто вставляются,  обновляются
        и удаляются, то эффективность использования памяти этим индексом
        может  периодически  ухудшаться  или  улучшаться.   Отслеживайте
        эффективность  использования  индексом  памяти  через регулярные
        интервалы времени,  сначала проверяя  действительность структуры
        индекса (см.  "Анализ таблиц, индексов и кластеров" на  странице
        8-62), а затем опрашивая обзор INDEX_STATS:

        SELECT pct_used FROM sys.index_stats WHERE name = 'имя_индекса';

        Процент  утилизации  памяти  индекса,  выдаваемый этим запросом,
        будет   варьироваться   в   зависимости   от   того,   как часто
        вставляются,  обновляются  и  удаляются  ключи  этого   индекса.
        Составьте  историю  средней  эффективности  использования памяти
        индекса,  несколько  раз  выволнив  следующую последовательность
        операций: проверку действительности индекса, проверку  PCT_USED,
        затем удаление и пересоздание индекса.  Когда вы обнаружите, что
        использование памяти индексом упало ниже своей средней цифры, вы
        можете сжать пространство индекса, удалив и пересоздав его.


Удаление индексов
-----------------

        Вы можете захотеть удалить индекс по любой из следующих причин:

            *  Индекс больше не требуется.

            *  Индекс    не    обеспечивает    ожидавшегося    улучшения
               производительности   для   запросов   по  ассоциированной
               таблице.  (Например, таблица слишком мала, или в  таблице
               много строк, но слишком мало записей индекса.)

            *  Приложения не используют этот индекс при опросах данных.



8-40  Руководство администратора


            *  Индекс стал недействительным  и должен быть  удален перед
               его  пересозданием.   (См.   "Анализ  таблиц,  индексов и
               кластеров" на странице 8-62).

            *  Индекс  стал  слишком  фрагментированным  и  должен  быть
               удален перед его пересозданием.

        Когда вы удаляете индекс, все экстенты его сегмента возвращаются
        в содержащее табличное пространство и становятся доступными  для
        других объектов в этом табличном пространстве.

        Способ удаления  индекса зависит  от того,  как был  создан этот
        индекс, -  явно, предложением  CREATE INDEX,  или неявно,  через
        определение  ограничения  ключа  для  таблицы.  Следующие секции
        объясняют, как удаляются оба типа индексов.

        Замечание:  При  удалении  таблицы  все  ассоциированные индексы
        удаляются автоматически.

Удаление индекса, ассоциированного с ограничением целостности

        Вы не можете удалить  один индекс, ассоциированный с  включенным
        ограничением целостности UNIQUE  или PRIMARY KEY.  Чтобы удалить
        такой индекс, вы должны отключить или удалить само  ограничение.
        См. "Управление ограничениями целостности" на странице 8-70.

Удаление явно созданного индекса

        Для  удаления  явно  созданного  индекса используйте команду SQL
        DROP  INDEX.   Например,  следующее  предложение  удаляет индекс
        EMP_ENAME:

        DROP INDEX emp_ename;

Привилегии, требуемые для удаления индекса

        Чтобы удалить индекс,  вы должны либо  иметь его в  своей схеме,
        либо обладать системной привилегией DROP ANY INDEX.


----------------

Управление кластерами, кластеризованными таблицами и индексами кластеров

        Следующие секции  объясняют, как  создавать, изменять  и удалять
        кластеры,  кластеризованные  таблицы  и  индексы кластеров.  Для
        дополнительной информации об управлении хэшированными кластерами
        обратитесь к секции  "Управление хэш-кластерами и  их таблицами"
        на странице 8-54.


Указания по управлению кластерами
---------------------------------

        Следующие секции приводят  некоторые рекомендации по  управлению
        кластерами.

Выбирайте подходящие таблицы для кластера

        Используйте кластеры для  хранения одной или  нескольких таблиц,
        которые главным образом опрашиваются (не так часто  изменяются),
        и  для  которых  запросы  часто  выполняют  соединение данных из

                                        Управление объектами схемы  8-41


        нескольких связанных таблиц, либо извлекают связанные данные  из
        одной таблицы.

Выбирайте подходящие столбцы для ключа кластера

        Тщательно  выбирайте  столбцы   для  ключа  кластера.    Если  в
        запросах, выполняющих соединение таблиц, используются  несколько
        общих  столбцов,  сделайте  ключ  кластера  составным ключом.  В
        общем,  характеристики,  которые   указывают  на  хороший   ключ
        кластера,  те  же,  что   и  для  любого  индекса;   см.  секцию
        "Индексируйте корректные таблицы и столбцы" на странице 8-33.

        Хороший ключ кластера имеет достаточно уникальных значений,  так
        что  группа  строк,  соответствующих  каждому  значению   ключа,
        заполняет приблизительно один блок данных.  Слишком малое  число
        строк на  значение ключа  кластера приводит  к расходу  памяти и
        мало  дает  для  улучшения  производительности.   Ключи кластера
        столь специфичны,  что слишком  малое количество  строк, имеющих
        одинаковое значение ключа,  дает большой процент  неиспользуемой
        памяти  в  блоках,  если  только  при  создании кластера не было
        специфицировано маленькое значение SIZE (см. ниже).

        Слишком большое  число строк  на значение  ключа кластера  может
        привести к  лишним просмотрам  при отыскании  строк для  данного
        ключа.   Ключи  кластера,  созданные  по слишком общим атрибутам
        (таким, как пол: МУЖ или  ЖЕН), приводят к избыточным поискам  и
        могут дать ухудшение производительности вместо улучшения.

        Индекс кластера не  может быть уникальным,  и не может  включать
        столбец, определенный с типом данных LONG.

Специфицируйте параметры использования памяти в блоке

        Специфицируя  параметры  PCTFREE  и  PCTUSED  во  время создания
        кластера,  вы  можете  повлиять  на  эффективность использования
        памяти  и   на  объем   памяти,  резервируемой   для  обновлений
        существующих  строк  в  блоках  данных сегмента данных кластера.
        Обратите  внимание,  что  параметры  PCTFREE  и PCTUSED, которые
        задаются  для  таблиц,  создаваемых  в  кластере,  игнорируются;
        кластеризованные таблицы автоматически используют характеристики
        памяти,  установленные  для  кластера.   См.  секцию "Управление
        использованием памяти  для блоков  данных" на  странице 8-2  для
        дополнительной  информации   и  рекомендаций   по  использованию
        параметров PCTFREE и PCTUSED.

Специфицируйте память, требуемую для среднего ключа кластера
и ассоциированных с ним строк

        Команда  CREATE  CLUSTER  имеет  необязательный  аргумент  SIZE,
        который представляет собой  оценочное число байт,  требуемых для
        типичного значения ключа кластера и ассоциированных с ним строк.
        ORACLE использует параметр SIZE для выполнения следующих задач:

            *  оценки числа  ключей кластера  (и ассоциированных  с ними
               строк), которые могут уместиться в блоке данных кластера
            *  ограничения количества ключей кластера, помещаемых в один
               блок  данных  кластера;  это  максимизирует эффективность
               хранения ключей в кластере

        SIZE не  лимитирует памяти,  которая может  использоваться любым
        данным значением ключа кластера.  Например, если SIZE установлен
        так, что в один блок  данных можно помещать два ключа  кластера,

8-42  Руководство администратора


        то  любое  из   этих  ключей  кластера   может  на  самом   деле
        использовать любое количество свободной памяти в блоке.

        По умолчанию,  в каждом  блоке данных  сегмента данных  кластера
        ORACLE хранит лишь  один ключ кластера  и все ассоциированные  с
        ним  строки.   Хотя  размер  блока  может варьироваться от одной
        операционной системы  к другой,  правило "один  ключ кластера на
        блок"    поддерживается,    когда    кластеризованные    таблицы
        импортируются в другие базы данных на других машинах.

        Для   вычисления   параметра   SIZE   для   кластера используйте
        процедуру, приведенную в секции "Расчет памяти для кластера"  на
        странице 8-43.

        Если все  строки для  данного значения  ключа кластера  не могут
        уместиться  в  одном  блоке,  несколько  блоков  соединяются   в
        цепочку,  чтобы  ускорить  доступ  ко  всем  значениям  с данным
        ключом.   Индекс  кластера  указывает  на начало цепочки блоков,
        каждый   из   которых   содержит   значение   ключа   кластера и
        ассоциированные строки.  Если SIZE для кластера выбран так,  что
        лишь  один  ключ  попадает  в  блок, то блоки могут принадлежать
        сразу нескольким цепочкам.

Специфицируйте местоположение каждого кластера
и индекса кластера

        Если  у   вас  есть   должные  привилегии   и  квоты   табличных
        пространств,   то   вы   можете   создать   новый   кластер    и
        ассоциированный  индекс  кластера  в  любом онлайновом табличном
        пространстве.    Всегда   специфицируйте   опцию   TABLESPACE  в
        предложении  CREATE  CLUSTER/INDEX,  чтобы явно идентифицировать
        табличное пространство для нового кластера или его индекса.

        Кластер  и  его  индекс  могут  быть  созданы в разных табличных
        пространствах.   Создание  кластера  и  ассоциированного индекса
        кластера в разных табличных пространствах, размещенных на разных
        дисках  позволяет  извлекать  данные  таблиц  и  данные  индекса
        одновременно, с минимальным соперничеством.

Оцените размер кластера и установите параметры памяти

        Причины, по которым следует оценивать размер кластера перед  его
        созданием, те же, что и причины для оценки размеров таблиц.  См.
        секцию "Оцените размер таблицы и установите параметры памяти" на
        странице 8-16.

        Для  вычисления  памяти,  требуемой  для  кластера,  используйте
        процедуру, описанную в следующей секции.


Расчет памяти для кластеров
---------------------------

        Следующая процедура демонстрирует,  как оценить начальный  объем
        памяти,  требуемой  для   множества  таблиц  в   кластере.   Для
        получения  окончательной  оценки  требуется  провести  несколько
        вычислений, а  некоторые из  констант (они  отмечены звездочкой)
        зависят  от  операционной   системы.   Ваши  оценки   не  должны
        существенно  отличаться  от  фактических  значений.   По  поводу
        возможных  значительных  отклонений  от  констант, приведенных в
        описываемой ниже процедуре,  обратитесь к вашему  руководству по
        инсталляции [IUG].

                                        Управление объектами схемы  8-43


        Заметим,  что  эта  процедура  оценивает  лишь  начальный  объем
        памяти,  требуемый  для  кластера  в  базе  данных  ORACLE.  При
        использовании  этих  оценок  имейте  в  виду  следующие факторы,
        которые могут повлиять на точность расчетов:

            *  Память,  используемая  для   записей  транзакций  и   для
               удаленных  строк,  не  становится  доступной  немедленно,
               из-за отсроченной процедуры очистки.

            *  Хвостовые пустые значения и их байты длины не хранятся.

            *  Вставки, обновления  и удаления  строк, а  также столбцы,
               превышающие  размер  блока   данных,  могут  привести   к
               фрагментации   и   цепочкам   кусков   строк.     Поэтому
               последующие  оценки  имеют  склонность  к  занижению   по
               сравнению  с  реальными  величинами,  если   фрагментация
               существенна.

        Вычислив размер кластера по приведенной ниже процедуре, добавьте
        еще  от  10  до  20  процентов,  чтобы  получить  оценку размера
        начального экстента для рабочего кластера.

        Оценка размера кластера выполняется следующими шагами:

        1. Вычислите общий размер заголовка блока.

        2. Вычислите размер свободной памяти в блоке данных.

        3. Вычислите сумму длин столбцов для средней строки на ключ
           кластера.

        4. Вычислите общий размер средней строки для всех кластеризуемых
           таблиц.

        5. Вычислите средний размер блока кластера.

        6. Вычислите общее число блоков, требуемое для кластера.

        Ниже объяснен каждый из этих шагов.

Шаг 1: Вычислите общий размер заголовка блока

        Память, требуемая для заголовка блока, представляется  следующей
        формулой:

        заголовок блока = фикс.заголовок + перем.заголовок транзакций
                          + оглавление таблиц + оглавление строк

        Здесь:

            фикс.заголовок (*)  57 байт

            переменный (*)      23*I
            заголовок           где I - значение INITRANS для таблицы
            транзакций

            оглавление таблиц   4*N + 1
                                где N - число таблиц в сегменте данных





8-44  Руководство администратора


            оглавление строк       2*R
                                   где R - число строк на блок
                                           (вычисляемое в шаге 5)

        Если INITRANS  = 2,  то мы  можем частично  разрешить предыдущие
        формулы:

            заголовок блока = 57 + 46 + (4N + 1) + 2R байт
                            = 104+ 4Т + 2R байт

Шаг 2: Вычислите размер свободной памяти в блоке данных

        Память,   резервируемая   в   каждом   блоке   для   данных    и
        специфицируемая параметром PCTFREE,  вычисляется как процент  от
        размера блока за вычетом заголовка блока:

        свободная память = (размер блока - общий размер заголовка)

        Размер  блока  базы  данных  устанавливается  при  создании базы
        данных; вы можете узнать его, выдав команду SQL*DBA SHOW:

            SHOW PARAMETERS db_block_size;

        Замечание: Для дополнительной информации о команде SQL*DBA  SHOW
        обратитесь к документу ORACLE7 Server Utilities User's Guide.

        Предположив, что  размер блока  равен 2K,  мы получим  следующую
        оценку для свободной памяти для новых данных в блоке:

            свободная память = (2048 - (104 + 4N + 2R)
                             = (1944 - 4N - 2R) байт

        Принимая, что  в кластере  две таблицы  (т.е.  N  = 2), мы можем
        упростить эту формулу до следующей:

            свободная память = 1944 - (4*2) - 2R байт
                             = 1932 - 2R байт

Шаг 3: Вычислите сумму длин столбцов для средней строки на ключ кластера

        Вычислите  память,  требуемую   для  значений  средней   строки,
        используя шаг 3 процедуры, обсуждавшейся в секции "Расчет памяти
        для  некластеризованных  таблиц"  на  странице  8-19.   Обратите
        внимание на следующие тонкости:

            *  Вычислите память, требуемую для значений средней  строки,
               отдельно по  каждой таблице  в кластере.   Например, если
               кластер  содержит  таблицы  T1  и  T2,  вычислите средний
               размер строки для обеих этих таблиц.














                                        Управление объектами схемы  8-45


            *  Не включайте в  указанные выше расчеты  память, требуемую
               для ключа кластера.   Однако отметьте количество  памяти,
               требуемое для хранения среднего значения ключа  кластера,
               для  шага  5.   Например,  вычисляя память, требуемую для
               средней строки таблицы T1, не включайте память, требуемую
               для хранения ключа кластера.

            *  Не включайте память, требуемую для заголовка строки (т.е.
               байты  длины  дя  каждого  столбца);  эта  память   будет
               подсчитываться на следующем шаге.

        Например, предположим,  что две  кластеризуемые таблицы  созданы
        следующими предложениями:

            CREATE TABLE t1 (a CHAR(10), b DATE, c NUMBER(10,2))
                   CLUSTER t1_t2 (c);

            CREATE TABLE t2 (c NUMBER(10,2), d CHAR(10))
                   CLUSTER t1_t2 (c);

        Заметьте,  что  ключом  кластера  является  столбец  C  в каждой
        таблице.

        Рассматривая эти таблицы, вычислим память, требуемую для средней
        строки таблицы T1  (D1) и память,  требуемую для средней  строки
        таблицы T2 (D2):

            D1 (память на среднюю строку) = (a + b)
                                          = (10 + 7) байт
                                          = 17 байт

            D2 (память на среднюю строку) = (d)
                                          = 10 байт

Шаг 4: Вычислите общий размер средней строки для кластеризуемых таблиц

        Вы  можете  вычислить  минимальный  объем  памяти, требуемой для
        строки в кластеризованной таблице, по следующей формуле:

            S(n)  байт/строку = заголовок строки + F(n)  + V(n)  + D(n)























8-46  Руководство администратора


        где:

            заголовок строки(*) 4 байта  на  строку для кластеризованной
                                таблицы.

            F(n)                Общее  число   байтов  длины   для  всех
                                столбцов  в  таблице  (n)  с длинами 250
                                байт  или   меньше.   На   каждый  такой
                                столбец отводится один байт длины.

            V(n)                Общее  число   байтов  длины   для  всех
                                столбцов в таблице (n) с длинами  больше
                                250 байт  или меньше.   На каждый  такой
                                столбец отводится 3 байта длины.

            D(n)                Комбинированная память для всех столбцов
                                в средней  строке  таблицы (n)  (из шага
                                3).

        Замечание:  Не  включайте  длины  столбцов  для ключа кластера в
        переменные F и  V ни для  одной таблицы в  кластере.  Эта память
        будет подсчитана на шаге 5.

        Например, общий размер средней строки кластеризованных таблиц T1
        и T2, описанных в шаге 3, составляет:

            S(1) = (4 + (1 * 2) + (3 * 0) + 17) байт
                 = 23 байта

            S(2) = (4 + (1 * 1) + (3 * 0) + 10) байт
                 = 15 байт

        Замечание:    Абсолютный    минимум    для    размера     строки
        кластеризованной   таблицы   равен   10   байт,   и   зависит от
        операционной системы.  Поэтому,  если ваше вычисленное  значение
        общего  размера  средней  строки  таблицы меньше 10, используйте
        вместо него число 10 в последующих расчетах.

Шаг 5: Вычислите средний размер блока кластера

        Чтобы вычислить средний  размер блока кластера,  сначала оцените
        среднее число строк (по всем таблицам) на ключ кластера.   После
        того,  как  это  известно,  используйте  следующую  формулу  для
        вычисления среднего размера блока кластера:

           средний размер блока кластера (байт) =
           (( R(1)*S(1) ) + ( R(2)*S(2) ) + .. + ( R(n)*S(n) ))
              + заголовок ключа + C(k) + S(k) + 2R(t)

        где:

            R(n)                Среднее число строк в таблице (n),
                                ассоциированных с ключом кластера.

            S(n)                Средний размер строки в таблице (n),
                                вычисленный на шаге 4.

            заголовок ключа(*)  19

            C(k)                Длина столбцов для ключа кластера.



                                        Управление объектами схемы  8-47


            S(k)                Память, требуемая для хранения среднего
                                значения ключа кластера.

            R(t)                Общее число строк, ассоциироованных со
                                средним ключом кластера (т.е. сумма
                                R(1)+R(2)+...+R(n)). Это учитывает
                                память, требуемую в заголовке блока для
                                каждой строки в блоке.

        Например, рассмотрим кластер, содержащий таблицы T1 и T2.  Пусть
        средний ключ кластера имеет одну строку на таблицу T1 и 20 строк
        на таблицу T2. Пусть также ключ кластера имеет тип данных NUMBER
        (один байт на длину столбца),  и среднее значение ключа имеет  4
        цифры  (3   байта).   С   учетом  этих   условий  и   предыдущих
        результатов, средняя память на ключ кластера (и  ассоциированные
        строки) составит:

            SIZE = ((1 * 23) + (20 * 15) + 19 + 1 + 3 + (2 * 21) байт
                 = 388 байт

        Подставьте вычисленное значение в опцию SIZE, когда вы  создаете
        кластер с помощью команды CREATE CLUSTER.  Это оценивает память,
        требуемую   для   хранения   среднего   ключа   кластера  и всех
        ассоциированных с ним строк; ORACLE использует значение SIZE для
        того, чтобы ограничить количество ключей кластера, которе  могут
        назначаться одному  и тому  же блоку  данных.  Вычислив  среднее
        значение  SIZE,  несколько  увеличьте  его, чтобы учесть память,
        требуемую для тех ключей кластера, которые перевешивают  среднюю
        оценку.

        Чтобы оценить число ключей  кластера, которые умещаются в  блоке
        данных, используйте следующую формулу, которая использует размер
        свободной  памяти,  вычисленный  вами  на  шаге  2, число строк,
        ассоциированных  со  средним  ключом  кластера  R(t), и значение
        SIZE:

            # ключей/блок = FLOOR ( своб.память + 2R / (SIZE + 2R(t)) )

        Например, взяв значение SIZE = 400 байт (оцененное значение  388
        после округления вверх), R(t) = 21, а размер свободной памяти  в
        блоке = 1742 - 2R байт, получим следующий результат:

            # ключей/блок = FLOOR ((1936 - 2R + 2R) / (400 + 2 * 21))
                          = FLOOR (1936 / 442)
                          = FLOOR (4.4)
                          = 4

Шаг 6: Вычислите общее число блоков, требуемое для кластера

        Чтобы вычислить общее число  блоков, требуемое для кластера,  вы
        должны оценить число возможных значений ключа в кластере.  После
        этого используйте следующую формулу, чтобы вычислить общее число
        блоков, требуемое для кластера:










8-48  Руководство администратора


            # блоков = CEIL(# ключей кластера / # ключей на блок)

        Замечание:  если  у  вас  есть  тестовая  база данных, вы можете
        использовать статистику, сгенерированную командой ANALYZE, чтобы
        определить  количество  значений  ключа  кластера.   См. "Анализ
        таблиц, индексов и кластеров" на странице 8-62.

        Например, предположим, что  в кластере T1_T2  приблизительно 500
        значений ключа кластера.

            # блоков T1_T2 = CEIL(500/3)
                           = CEIL(166.7)
                           = 167

        Чтобы вычислить это же значение в байтах, умножьте результат  на
        размер блока данных соответствующей базы данных.

        Не забывайте, что эта процедура предоставляет приемлемую  ОЦЕНКУ
        размера кластера, но  не точное число  блоков или байт.   Оценив
        размер  кластера,  вы  можете  использовать  эту  информацию при
        специфицировании  параметра  памяти  INITIAL (размера начального
        экстента кластера)  в вашем  соответствующем предложении  CREATE
        CLUSTER.

Требования памяти для существующих таблиц кластера

        После того как кластеризованные таблицы созданы и  используются,
        память, требуемая  для них,  обычно выше,  чем оценка,  данная в
        предыдущей  секции.   Больше  памяти  требуется  из-за метода, с
        помощью которого ORACLE управляет свободным пространством в базе
        данных.


Создание кластеров, кластеризованных таблиц и индексов кластеров
----------------------------------------------------------------

        Кластер используется для  хранения одной или  нескольких таблиц,
        которые  часто  соединяются  вместе  в  запросах.   Не   следует
        кластеризовать  таблицы,  которые,  как  правило, обрабатываются
        индивидуально.

        После того, как кластер  создан, в нем можно  создавать таблицы.
        Однако  прежде  чем  в  кластеризованные  таблицы  можно   будет
        вставлять   строки,   должен   быть   создан   индекс  кластера.
        Использование  кластеров  не  влияет  на создание дополнительных
        индексов  для  кластеризованных  таблиц;  такие  индексы   можно
        создавать и удалять как обычно.

        Для создания  кластера используйте  команду SQL  CREATE CLUSTER.
        Например,  следующее  предложение   создает  кластер  с   именеи
        EMP_DEPT,   который   будет   содержать   таблицы   EMP  и DEPT,
        кластеризуемые по (общему) столбцу DEPTNO:











                                        Управление объектами схемы  8-49


        CREATE CLUSTER emp_dept (deptno NUMBER(3))
            PCTUSED 80
            PCTFREE 5
            SIZE 600
            TABLESPACE users
            STORAGE (INITIAL 200K
                     NEXT 300K
                     MINEXTENTS 2
                     MAXEXTENTS 20
                     PCTINCREASE 33);

        Для создания таблицы в  кластере используйте команду SQL  CREATE
        TABLE с опцией CLUSTER.  Например, таблицы EMP и DEPT могут быть
        созданы в кластере EMP_DEPT с помощью следующих предложений:

        CREATE TABLE dept (
            deptno NUMBER(3) PRIMARY KEY, . . . );
            CLUSTER emp_dept (deptno);

        CREATE TABLE emp (
            empno NUMBER(5) PRIMARY KEY,
            ename VARCHAR2(15) NOT NULL,
            . . .
            deptno NUMBER(3) REFERENCES dept)
            CLUSTER emp_dept (deptno);

        Замечание: Вы можете специфицировать в предложении CREATE  TABLE
        схему для кластеризуемой таблицы; кластеризованная таблица может
        быть в иной схеме, чем схема, которой принадлежит кластер.

        Индекс  кластера  должен  быть  создан  до  того, как в любую из
        кластеризованных  таблиц  можно  вставлять  строки.    Например,
        следующее  предложение  создает  индекс  кластера  для  кластера
        EMP_DEPT:

        CREATE INDEX emp_dept_index
            ON CLUSTER emp_dept
            INITRANS 2
            MAXTRANS 5
            TABLESPACE users
            STORAGE (INITIAL 50K
                     NEXT 50K
                     MINEXTENTS 2
                     MAXEXTENTS 10
                     PCTINCREASE 33)
            PCTFREE 5;

        Ключ  кластера   устанавливает  отношение   между  таблицами   в
        кластере.  Несколько  характеристик памяти  явно специфицированы
        для кластера и индекса кластера.













8-50  Руководство администратора


Привилегии, требуемые для создания кластера,
кластеризованной таблицы и индекса кластера

        Чтобы создать кластер в  своей схеме, вы должны  иметь системную
        привилегию  CREATE  CLUSTER,   а  также  квоту   для  табличного
        пространства,  в   котором  будет   содержаться  кластер,   либо
        системную  привилегию   UNLIMITED  TABLESPACE.    Чтобы  создать
        кластер в схеме другого пользователя, вы должны иметь  системную
        привилегию CREATE ANY CLUSTER, а владелец должен иметь квоту для
        табличного пространства,  в котором  будет содержаться  кластер,
        либо системную привилегию UNLIMITED TABLESPACE.

        Чтобы  создать  таблицу  в  кластере,  вы должны иметь системную
        привилегию CREATE TABLE или CREATE ANY TABLE.  Вам не  требуется
        иметь  квоту  табличного  пространства  или системную привилегию
        UNLIMITED TABLESPACE для создания кластеризованной таблицы.

        Чтобы создать индекс кластера,  должно быть справедливо одно  из
        следующих условий:

            *  Ваша  схема  содержит  кластер,  и  вы  имеете  системную
               привилегию CREATE INDEX.

            *  Вы имеете системную привилегию CREATE ANY INDEX.

        Обратитесь к главе 12 для дополнительной информации о  системных
        привилегиях, и к главе 11 о квотах табличных пространств.


Изменение кластеров
-------------------

        Вы  можете   изменить  существующий   кластер,  чтобы   изменить
        следующие характеристики:

            *  параметры использования памяти блока (PCTFREE, PCTUSED)

            *  средний размер ключа кластера (SIZE)

            *  характеристики входов транзакций (INITRANS, MAXTRANS)

            *  параметры памяти (NEXT, PCTINCREASE и т.п.)

        Замечание: См. секции "Управление таблицами" на странице 8-15  и
        "Управление кластерами, кластеризованными таблицами и  индексами
        кластеров" на странице  8-41 относительно рекомендаций  для этих
        опций.

        Изменяя параметры  использования памяти  блоков данных  кластера
        (PCTFREE  и  PCTUSED)  или  параметр  размера  кластера  (SIZE),
        обратите внимание, что новые значения применяются ко всем блокам
        данных,  используемым  кластером,  включая  как  те, которые уже
        распределены, так  и те,  которые будут  распределены в будущем.
        Однако  блоки,  уже  распределенные  кластеру, реорганизуются не
        немедленно   при   изменении   параметров   памяти,   а  по мере
        необходимости в процессе работы.

        Изменяя  характеристики  для   записей  транзакций  в   кластере
        (INITRANS  и  MAXTRANS),  обратите  внимание, что новое значение
        INITRANS применяется лишь к блокам, которые будут распределяться



                                        Управление объектами схемы  8-51


        для кластера в будущем,  тогда как MAXTRANS применяется  ко всем
        блокам (как текущим, так и распределяемым позже).

        Параметры памяти  INITIAL и  MINEXTENTS не  могут быть изменены.
        Изменения для всех остальных параметров памяти действуют лишь на
        экстенты, которые будут распределяться кластеру впоследствии.

        Для изменения  кластера используйте  команду SQL  ALTER CLUSTER.
        Например, следующее предложение изменяет кластер EMP_DEPT:

        ALTER CLUSTER emp_dept
            PCTFREE 30
            PCTUSED 60;


Привилегии, требуемые для изменения кластера

        Чтобы изменить кластер, вы должны иметь его в своей схеме,  либо
        владеть системной привилегией ALTER ANY CLUSTER.


Изменение кластеризованных таблиц и индекса кластера
----------------------------------------------------

        Вы можете  изменять кластеризованные  таблицы с  помощью команды
        SQL ALTER  TABLE.  Однако  любые параметры  использования памяти
        блока, параметры входов транзакций или параметры памяти, которые
        вы  задаете  в  предложении  ALTER  TABLE,  игнорируются; ORACLE
        использует  для  всех  кластеризованных  таблиц  соответствующие
        параметры,  установленные  для  кластера.   Поэтому  вы   можете
        использовать  команду  ALTER  TABLE  лишь  для  добавления   или
        модификации столбцов,  или для  добавления, удаления,  включения
        или  выключения  ограничений   целостности  или  триггеров   для
        кластеризованной таблицы.   См. "Изменение  таблиц" на  странице
        8-23.

        Вы  изменяете  индекс  кластера  точно  так же, как любые другие
        индексы.  См. "Изменение индексов" на странице 8-39.


Распределение памяти для кластера вручную
-----------------------------------------

        ORACLE  динамически  распределяет  дополнительные  экстенты  для
        сегмента данных  кластера при  необходимости.  Однако  вы можете
        захотеть явно распределить для кластера дополнительный  экстент.
        Например, в среде параллельного сервера ORACLE экстент  кластера
        может быть явно распределен для конкретной инстанции.

        Новый экстент можно распределить для кластера с помощью  команды
        SQL ALTER CLUSTER с опцией ALLOCATE EXTENT.  Для  дополнительной
        информации об этом параметре команды ALTER CLUSTER обратитесь  к
        документу ORACLE7 Parallel Server Administrator's Guide.


Удаление кластеров, кластеризованных таблиц и индексов кластеров
----------------------------------------------------------------

        Кластер может  быть удален,  если таблицы  в кластере  больше не
        нужны.  При удалении кластера удаляются все таблицы в кластере и
        соответствующий  индекс  кластера;  все экстенты, принадлежавшие
        как   сегменту   данных,   так   и   сегменту  индекса кластера,

8-52  Руководство администратора


        возвращаются в  содержащее табличное  пространство и  становятся
        доступными для других объектов в этом табличном пространстве.

        Кластеризованные  таблицы  можно  удалять  индивидуально, что не
        затрагивает кластер, другие кластеризованные таблицы или  индекс
        кластера.  Кластеризованная таблица удаляется  так же, как и  не
        кластеризованная  таблица  -   командой  SQL  DROP   TABLE;  см.
        "Удаление таблиц" на странице 8-25.

        Замечание:  Когда  вы  удаляете  из  кластера одиночную таблицу,
        ORACLE удаляет каждую  строку этой таблицы  индивидуально.  Если
        вы  намереваетесь   удалить  весь   кластер,  для   максимизации
        эффективности  используйте   команду  DROP   CLUSTER  с   опцией
        INCLUDING TABLES.  Удаляйте  из кластера индивидуальную  таблицу
        (с помощью команды DROP TABLE) лишь в том случае, если вы хотите
        оставить остальную часть кластера.

        Можно удалить индекс кластера,  не затрагивая сам кластер  и его
        таблицы.     Однако,    кластеризованные    таблицы    не  могут
        использоваться, пока  не существует  индекс кластера;  вы должны
        пересоздать индекс  кластера, чтобы  открыть доступ  к кластеру.
        Индексы кластера иногда  приходится удалять как  часть процедуры
        пересоздания фрагментированного индекса кластера.  См. "Удаление
        индексов" на странице 8-40.

        Чтобы  удалить  кластер,  не  содержащий  таблиц,  вместе  с его
        индексом,  используйте  команду  SQL  DROP  CLUSTER.   Например,
        следующее предложение удаляет пустой кластер с именем EMP_DEPT:

        DROP CLUSTER emp_dept;

        Если  кластер  содержит  одну  или  несколько   кластеризованных
        таблиц, и вы намереваетесь  удалить кластер вместе с  таблицами,
        добавьте  в  команду   DROP  CLUSTER  опцию   INCLUDING  TABLES,
        например:

        DROP CLUSTER emp_dept INCLUDING TABLES;

        Если опция INCLUDING TABLES опущена, а кластер содержит таблицы,
        то будет возвращена ошибка.

        Если одна или несколько таблиц в кластере содержат первичные или
        уникальные ключи, на  которые ссылаются ограничения  FOREIGN KEY
        таблиц,  находящихся  вне  кластера,  то  этот  кластер   нельзя
        удалить, не  удаляя одновременно  зависимых ограничений  FOREIGN
        KEY. Это легко сделать,  используя в команде DROP  CLUSTER опцию
        CASCADE CONSTRAINTS.  Например:

        DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS;

        ORACLE возвратит  ошибку, если  вы не  используете опцию CASCADE
        CONSTRAINTS и существуют зависимые ограничения.











                                        Управление объектами схемы  8-53


Привилегии, требуемые для удаления кластера

        Чтобы удалить кластер, вы должны  иметь его в своей схеме,  либо
        владеть системной привилегией DROP  ANY CLUSTER.  Вы не  обязаны
        иметь   дополнительных   привилегий   для   удаления   кластера,
        содержащего  таблицы,  даже  если  кластеризованные  таблицы  не
        принадлежат владельцу этого кластера.


----------------

Управление хэш-кластерами и их таблицами

        Следующие секции  объясняют, как  создавать, изменять  и удалять
        хэшированные  кластеры  и  кластеризованные  таблицы  с  помощью
        команд SQL. Приводится несколько примеров таких команд.


Когда использовать хэширование
------------------------------

        Хранение таблицы в хэш-кластере является альтернативой  хранению
        этой же  таблицы с  индексом.  Хэширование  полезно в  следующих
        ситуациях:

            *  Большинство запросов содержат условия равенства для ключа
               кластера.  Например:

               SELECT ... WHERE ключ_кластера = ...;

               В  таких  ситуациях,  ключ  кластера  можно хэшировать, и
               соответствующий  хэш-ключ  обычно  отыскивается  за  одну
               операцию   чтения.    Сравните   это   с  индексированной
               таблицей,  когда  значение  ключа  сначала  должно   быть
               найдено  в  индексе  (обычно  несколько  чтений), а затем
               строка считывается из таблицы (еще одно чтение).

            *  Таблицы в хэш-кластере  довольно статичны в  размере, так
               что  вы  можете  определить  число  строк и объем памяти,
               требуемый  для  таблиц  в  кластере.   Если  таблицам   в
               хэш-кластере   потребуется   дополнительное  пространство
               после  начального  распределения  для  кластера,  падение
               производительности может оказаться значительным, так  как
               потребуются блоки переполнения.

        Хэширование не дает преимущества в следующих сиуациях:

            *  Большинство  запросов   извлекают  строки   по  интервалу
               значений  ключа  кластера.   Например,  полные  просмотры
               таблиц, или запросы вида:

               SELECT ... WHERE ключ_кластера < ...;

               В таких ситуациях хэш-функция не может быть  использована
               для   определения   местоположения   конкретных  значений
               хэш-ключа;  вместо  этого  приходится  применять   полный
               просмотр таблицы,  чтобы извлечь  строки для  запроса.  В
               случае   индексированного   кластера,   значения    ключа
               отсортированы  в  индексе,   и  поэтому  значения   ключа
               кластера,  удовлетворяющие  фразе  WHERE  запроса,  можно
               отыскать   за   относительно   небольшое   число операций
               ввода-вывода.

8-54  Руководство администратора


            *  Таблица  не  статична  и  постоянно растет.  Если таблица
               растет без ограничений, то память, требуемая на все время
               жизни таблицы  (а значит,  и ее  кластера) не  может быть
               предсказана.

            *  Приложения часто  выполняют полные  просмотры таблицы,  а
               значения в таблице  сильно разрежены.  Полный  просмотр в
               такой ситуации идет дольше при хэшировании.

            *  Вы  не  можете  позволить  себе  заранее распределить все
               пространство,  которое  в  конечном  счете  требуется для
               хэш-кластера.

        В  большинстве   случаев  вы   должны  решить   (основываясь  на
        приведенной  выше  информации),  применять  ли  хэширование  или
        индексирование.  Если вы решите использовать индексирование, вам
        следует рассмотреть,  хранить ли  таблицу индивидуально  или как
        часть  кластера;  см.  секцию  "Выбирайте подходящие таблицы для
        кластера" на странице 8-41.

        Замечание: Даже если вы решили использовать хэширование, таблица
        по-прежнему может иметь отдельные  индексы по любым столбцам,  в
        том числе  по ключу  кластера.  Для  дополнительных рекомендаций
        обратитесь к  документу ORACLE7  Server Application  Developer's
        Guide.

Расчет памяти для хэш-кластеров
-------------------------------

        Как  и  для  индексированных  кластеров,  важно  оценить память,
        требуемую  для  данных  в  хэш-кластере.  Используйте процедуру,
        описанную в  секции "Расчет  памяти для  кластеров" на  странице
        8-43, со следующими дополнительными замечаниями:

            *  Побочной целью приведенной процедуры является определение
               размера памяти для каждого ключа кластера (SIZE).  Однако
               для  хэш-кластеров  побочной  целью  является определение
               размера памяти для каждого хэш-ключа.  Поэтому вы  должны
               рассматривать  не  только  число  строк на значение ключа
               кластера, но  также распределение  ключей кластера  среди
               хэш-ключей в кластере.

            *  На шаге  3, не  забудьте включить  память, требуемую  для
               значения ключа кластера.   В отличие от  индексированного
               кластера, в хэш-кластере значение ключа кластера хранится
               в каждой строке данных.

            *  На шаге 5  вы вычисляете средний  размер хэш-ключа, а  не
               средний  размер  ключа  кластера.   Поэтому  примите   во
               внимание,  сколько  ключей  кластера  попадают  на каждое
               значение  хэш-ключа.   Кроме  того,  отбросьте добавление
               памяти, требуемой для значения ключа кластера, C(k).  Эта
               память уже засчитана на шаге 3 (см. предыдущий пункт).

        ORACLE   гарантирует,   что   начальное   распределение   памяти
        достаточно для размещения хэш-таблицы, согласно значениям SIZE и
        HASHKEYS.   Если  значений  параметров  памяти  (INITIAL, NEXT и
        MINEXTENTS)   не   хватает   для   размера   хэш-таблицы,  будут
        распределены дополнительные (инкрементальные) экстенты, пока  не
        будет распределено как  минимум SIZE*HASKEYS памяти.   Например,
        предположим, что размер блока данных равен 2K, свободная  память
        в блоке составляет приблизительно 1900 байт (размер блока данных

                                        Управление объектами схемы  8-55


        минус  накладные  расходы),  а  параметры  STORAGE  и  параметры
        хэш-кластера специфицированы в команде CREATE CLUSTER  следующим
        образом:

        STORAGE (INITIAL 100K
                 NEXT 150K
                 MINEXTENTS 1
                 PCTINCREASE 0)
        SIZE 1500
        HASHKEYS 100

        В этом  примере, на  блок данных  может быть  назначен лишь один
        хэш-ключ.  Поэтому начальная память, требуемая для хэш-кластера,
        составляет как минимум  2*100K, т.е. 200K.   Значения параметров
        памяти не удовлетворяют этому требованию.  Поэтому  хэш-кластеру
        будет  распределен  начальный  экстент  (100K)  и второй экстент
        размером 150K.

        Альтернативно,   предположим,    что   параметры    хэш-кластера
        специфицированы следующим образом:

        SIZE 500  HASHKEYS 100

        В этом  случае кажому  блоку данных  назначаются три  хэш-ключа.
        Поэтому начальная память, требуемая для хэш-кластера, составляет
        как  минимум  34*2K,  т.е.  68K.   Значения  параметров   памяти
        удовлетворяют этому требованию, и хэш-кластеру будет распределен
        начальный экстент (100K).


Создание хэш-кластеров и кластеризованных таблиц
------------------------------------------------

        Хэш-кластер используется для хранения индивидуальных таблиц  или
        групп  кластеризованных   таблиц,  которые   статичны  и   часто
        опрашиваются запросами  на условия  равенства.  После  того, как
        создан хэш-кластер, в нем можно создавать таблицы.

        Хэш-кластер  создается  с  помощью  команды  SQL CREATE CLUSTER.
        Например,  следующее  предложение   создает  кластер  с   именем
        TRIAL_CLUSTER, который используется для хранения таблицы  TRIAL,
        кластеризуемой по столбцу TRIALNO:

        CREATE CLUSTER trial_cluster (trialno NUMBER(5,0))
            PCTUSED 80
            PCTFREE 5
            TABLESPACE users
            STORAGE (INITIAL 250K    NEXT 50K
                     MINEXTENTS 1    MAXEXTENTS 3
                     PCTINCREASE 0)
            SIZE 2K
            HASH IS trialno HASHKEYS 150;

        CREATE TABLE trial (
            trialno NUMBER(5,0) PRIMARY KEY,
            ...)
            CLUSTER trial_cluster (trialno);






8-56  Руководство администратора


        Следующие секции  объясняют значения  параметров команды  CREATE
        CLUSTER,  специфичные  для  хэш-кластеров.   Для  дополнительной
        информации  о  создании  таблиц  в  кластере,  рекомендациях  по
        установке  других  параметров  команды  CREATE  CLUSTER, а также
        привилегиях, требуемых для  создания хэш-кластера, обратитесь  к
        секции "Создание кластеров,  кластеризованных таблиц и  индексов
        кластеров" на странице 8-49.

Управление использованием памяти в хэш-кластере

        При создании хэш-кластера важно корректно выбрать ключ  кластера
        и  установить  параметры  HASH  IS,  SIZE  и HASHKEYS так, чтобы
        оптимизировать   производительность   и   использование  памяти.
        Следующие  секции  предоставляют   рекомендации  и  примеры   по
        установке этих параметров.

        ВЫБОР КЛЮЧА.  Выбор корректного  ключа кластера зависит от  типа
        запросов,  которые  наиболее  часто  выдаются  по кластеризуемым
        таблицам.   Например,  рассмотрим  таблицу  EMP  в хэш-кластере.
        Если  запросы  часто  выбирают  строки  по номеру сотрудника, то
        ключом  кластера  следует  сделать  столбец  EMPNO; если запросы
        часто  выбирают  строки  по  номеру  отдела,  то ключом кластера
        должен  быть  столбец  DEPTNO.   Для  хэш-кластеров,  содержащих
        единственную таблицу, за ключ кластера обычно принимается полный
        первичный ключ этой таблицы.

        Ключ хэш-кластера (как  и ключ индексированного  кластера) может
        быть  одиночным  столбцом   или  составным  ключом   (ключом  из
        нескольких  столбцов).   Хэш-кластер  с  составным ключом должен
        использовать внутреннюю хэш-функцию ORACLE.

        УСТАНОВКА HASH  IS. Специфицируйте  HASH IS  только тогда, когда
        ключ кластера является одиночным столбцом с типом данных NUMBER,
        и содержит равномерно  распределенные целые значения.   Если эти
        условия соблюдены, вы можете распределить строки в кластере так,
        что  каждое  уникальное  значение  ключа  кластера  хэшируется в
        уникальное хэш-значение  (без коллизий);  ознакомьтесь также  со
        следующими  секциями  относительно  установки  SIZE  и HASHKEYS.
        Если эти условия  не соблюдены, опустите  эту опцию, так  что вы
        будете использовать внутреннюю хэш-функцию ORACLE.

        УСТАНОВКА  SIZE.   Параметр  SIZE  должен  быть  установлен  как
        среднее количество памяти, требуемое  для хранения всех строк  с
        любым данным хэш-ключом.   Поэтому для правильного  задания SIZE
        вы должны знать характеристики ваших данных.

            *  Если хэш-кластер должен содержать единственную таблицу, и
               значения  хэш-ключа  по  строкам  этой  таблицы уникальны
               (одна строка на значение), то SIZE должен быть установлен
               как средний размер строки в кластере.

            *  Если хэш-кластер  должен содержать  несколько таблиц,  то
               SIZE  должен  быть  установлен  как  среднее   количество
               памяти,    необходимое    для    хранения    всех  строк,
               ассоциированных с репрезентативным хэш-значением.

        Чтобы   вычислить   предварительное   значение   SIZE,  следуйте
        процедурам,   приведенным   в   секции   "Расчет   памяти    для
        хэш-кластеров" на странице 8-55.  Если предварительное  значение




                                        Управление объектами схемы  8-57


        SIZE  мало  (на  блок  данных  можно  назначить  более   четырех
        хэш-ключей),  вы  можете  использовать  это  значение для SIZE в
        команде CREATE CLUSTER.  Однако,  если значение SIZE велико  (на
        блок данных  можно назначить  менее пяти  ключей), то  вы должны
        также рассмотреть ожидаемую  частоту коллизий и  определить, что
        для  вас  важнее  -  производительность  извлечения  данных  или
        эффективность использования памяти:

            *  Если  хэш-кластер  не  использует  внутреннюю хэш-функцию
               (т.е.  специфицировано  HASH  IS),  и  вы  ожидаете  мало
               коллизий,  то  вы  можете  установить  SIZE как вычислено
               выше;  коллизии  не  происходят,  а память используется с
               максимально возможной эффективностью.

            *  Если  вы   ожидаете  частых   коллизий,  то   вероятность
               распределения  блоков  переполнения  для  хранения  строк
               высока.  Чтобы уменьшить вероятность блоков  переполнения
               и   максимизировать    производительность   при    частых
               коллизиях, вы  должны увеличить  SIZE согласно  следующей
               таблице,  в   зависимости  от   того,  сколько   значений
               хэш-ключа помещается в свободной памяти блока данных:

               г===================================T===================¬
               ¦ Свободная память/Вычисленное SIZE ¦ Значение для SIZE ¦
               ¦-----------------------------------+-------------------¦
               ¦                 1                 ¦ Вычисленное       ¦
               ¦-----------------------------------+-------------------¦
               ¦                 2                 ¦ Вычисленное + 15% ¦
               ¦-----------------------------------+-------------------¦
               ¦                 3                 ¦ Вычисленное + 12% ¦
               ¦-----------------------------------+-------------------¦
               ¦                 4                 ¦ Вычисленное + 8%  ¦
               ¦-----------------------------------+-------------------¦
               ¦               > 4                 ¦ Вычисленное       ¦
               L===================================¦===================-

        Переоценка значения SIZE увеличивает объем неиспользуемой памяти
        в  кластере.   Если  эффективность  памяти  для  вас важнее, чем
        производительность  извлечения  данных,  игнорируйте приведенную
        выше таблицу и используйте вычисленное значение SIZE.

        УСТАНОВКА   HASHKEYS.    Параметр   HASHKEYS   всегда    следует
        устанавливать  как  число  уникальных  значений  ключа кластера,
        округленное вверх до следующего простого числа (в предположении,
        что  используются  рекомендации  предыдущих  двух  секций).  Для
        максимального распределения строк в хэш-кластере HASHKEYS всегда
        должно быть простым числом.

        Например,  предположим,  что  вы  кластеризуете  таблицу  EMP по
        номеру  отдела  DEPTNO,  и  существуют  100  номеров  отделов, с
        значениями 10, 20, ..., 10000.  Допустим, вы обходите внутреннюю
        хэш-функцию и создаете кластер при HASHKEYS = 100.  Тогда  отдел
        10 хэшируется в 10, отдел 20 - в 20, ..., отдел 110 - в 10  (110
        mod 100),  отдел 120  - в  20, и  так далее.   Заметьте, что  вы
        получите по  десять строк  для хэш-значений  10, 20,  ..., но ни
        одной строки для хэш-значений 1, 2, ..., и т.д.  Как  следствие,
        вы  получите  много  неиспользуемой  памяти,  и, возможно, много
        блоков переполнения из-за  коллизий.  Альтернативно, если  бы вы
        установили HASHKEYS = 101, то каждый номер отдела хэшировался бы
        в уникальное значение хэш-ключа.



8-58  Руководство администратора


Примеры выбора ключа и установки параметров хэш-кластера

        Следующие  примеры  показывают,  как  корректно  выбирать   ключ
        кластера и устанавливать параметры HASH IS, SIZE и HASHKEYS.  Во
        всех примерах предполагается, что размер блока равен 2K, и что в
        среднем каждый  блок имеет  1950 байт  свободной памяти  (размер
        блока минус накладные расходы).

    Пример 1

        Вы  решили  загрузить  таблицу  EMP  в хэш-кластер.  Большинство
        запросов извлекают записи о сотрудниках по номерам  сотрудников.
        Вы  оцениваете,  что  максимальный  размер  таблицы  EMP в любой
        момент  составляет  10000  строк,  и  что  средний размер строки
        составляет 55 байт.

        В  этом  случае  ключом  кластера  должен  быть  столбец  EMPNO.
        Поскольку   этот   столбец   содержит   целочисленные уникальные
        значения,  можно  обойти  внутреннюю  хэш-функцию.   SIZE  можно
        установить в  средний размер  строки, 55  байт; заметим,  что на
        блок назначаются 34 хэш-ключа.  HASHKEYS должно быть установлено
        как  число  строк  в   таблице,  10000,  округленное  вверх   до
        ближайшего простого числа, 10001:

        CREATE CLUSTER emp_cluster (empno NUMBER)
        . . .
        SIZE 55
        HASH IS empno HASHKEYS 10001;

    Пример 2

        Обстоятельства  те  же,  что  и  в предыдущем примере.  В данном
        случае,  однако,  строки  обычно  извлекаются  по номеру отдела.
        Количество отделов не  превышает 1000, со  средним числом по  10
        сотрудников на каждый отдел.  Заметим, что номера отделов кратны
        10 (0, 10, 20, 30, ...).

        В  этом  случае  ключом  кластера  должен  быть  столбец DEPTNO.
        Поскольку   этот   столбец   содержит   целочисленные равномерно
        распределенные  значения,  можно  обойти внутреннюю хэш-функцию.
        Вычисляемое  значение  SIZE  (среднее  количество  памяти на все
        строки для одного отдела) составляет 55 байт * 10, или 550 байт.
        При  использовании  такого  значения  SIZE  на блок данных можно
        назначить  лишь  три  хэш-значения.   Если вы ожидаете некоторых
        коллизий  и  добиваетесь  максимальной  эффективности извлечения
        данных,  несколько  увеличьте  вычисленное  значение SIZE, чтобы
        избежать  появления  блоков  переполнения  при коллизиях.  После
        увеличения SIZE на  12%, до 620  байт (см. таблицу  в предыдущей
        секции)  на  блок  по-прежнему  назначаются три хэш-значения, но
        отводится больше места для строк на случай ожидаемых коллизий.

        HASHKEYS можно  установить в  число уникальных  номеров отделов,
        1000, округленное вверх до ближайшего простого числа, 1009.










                                        Управление объектами схемы  8-59


        CREATE CLUSTER emp_cluster (deptno NUMBER)
        . . .
        SIZE 620
        HASH IS deptno HASHKEYS 1009;


Изменение хэш-кластеров
-----------------------

        Для  изменения  хэш-кластера   используйте  команду  SQL   ALTER
        CLUSTER:

        ALTER CLUSTER emp_dept . . .;

        Соображения по поводу изменений хэш-кластера такие же, как и для
        индексированного кластера.  Однако заметьте, что параметры SIZE,
        HASHKEYS и HASH IS  не могут быть специфицированы  в предложении
        ALTER CLUSTER.  Чтобы изменить эти параметры, вы должны  создать
        новый кластер  и скопировать  в него  данные из  первоначального
        кластера.  См. "Изменение кластеров" на странице 8-51.


Удаление хэш-кластеров
----------------------

        Для удаления хэш-кластера используйте команду SQL DROP CLUSTER:

        DROP CLUSTER emp_dept;

        Чтобы удалить  таблицу в  хэш-кластере, используйте  команду SQL
        DROP TABLE.  Соображения по вопросам удаления хэш-кластера и его
        таблиц  такие  же,  как  и  для  индексированного кластера.  См.
        "Удаление   кластеров,   кластеризованных   таблиц   и  индексов
        кластеров" на странице 8-52.


----------------

Разные вопросы управления объектами схемы

        Следующие  секции   рассматривают  различные   темы,  касающиеся
        сопровождения разнообразных объектов схемы, которые  обсуждались
        в этой главе.


Создание нескольких таблиц и обзоров за одну операцию
-----------------------------------------------------

        Вы  можете  создать  несколько  таблиц  и  обзоров,  и назначить
        привилегии  за  одну  операцию,  используя  команду  SQL  CREATE
        SCHEMA.  Команда  CREATE SCHEMA  полезна тогда,  когда вы хотите
        гарантировать успешное создание  всех нужных объектов  и грантов
        за  одну  операцию;  если  индивидуальный  объект  внутри   этой
        операции не  может быть  создан, все  предложение откатывается и
        аннулируются   все   его   результаты.    Например,    следующее
        предложение создает две таблицы  и обзор, соединяющий данные  из
        этих двух таблиц:






8-60  Руководство администратора


        CREATE SCHEMA AUTHORIZATION scott
          CREATE TABLE dept (
            deptno    NUMBER(3,0) PRIMARY KEY,
            dname     VARCHAR2(15),
            loc       VARCHAR2(25))
          CREATE TABLE emp (
            empno     NUMBER(5,0) PRIMARY KEY,
            ename     VARCHAR2(15) NOT NULL,
            job       NUMBER(5,0),
            hiredate  DATE DEFAULT (sysdate),
            sal       NUMBER(7,2),
            comm      NUMBER(7,2),
            deptno    NUMBER(3,0) NOT NULL
            CONSTRAINT dept_fkey REFERENCES dept)
          CREATE VIEW sales_staff AS
            SELECT empno, ename, sal, comm
              FROM emp
             WHERE deptno = 30
            WITH CHECK OPTION CONSTRAINT sales_staff_cnst
          GRANT SELECT ON sales_staff TO human_resources;

        Команда  CREATE  SCHEMA  не  поддерживает  расширений ORACLE для
        команд ANSI  CREATE TABLE  и CREATE  VIEW; это  касается и фразы
        STORAGE.

Привилегии, требуемые для создания множественных объектов схемы

        Для создания объектов схемы  с помощью команды CREATE  SCHEMA вы
        должны  иметь  необходимые  привилегии  для  каждой   включенной
        операции.  Например,  для создания  нескольких таблиц  с помощью
        команды CREATE  SCHEMA вы  должны иметь  привилегии, необходимые
        для создания таблиц.


Переименование объектов схемы
-----------------------------

        Вы  можете  переименовывать   объекты  схемы  двумя   различными
        способами: либо удалить и пересоздать объект, либо переименовать
        его  с  помощью  команды   SQL  RENAME.   Если  вы   удаляете  и
        пересоздаете  объект,  все  гранты  привилегий для этого объекта
        теряются  и  должны  быть  вновь  назначены  после  пересоздания
        объекта.   Альтернативно,  для  переименования  таблицы, обзора,
        последовательности или личного синонима для таблицы, обзора  или
        последовательности  может  использоваться  команда  RENAME.  При
        использовании команды  RENAME все  гранты, которые  были сделаны
        для  объекта,  переносятся  на  новое  имя.  Например, следующее
        предложение переименовывает обзор SALES_STAFF:

        RENAME sales_staff TO dept_30;

        Замечание:   Командой   RENAME   нельзя   переименовать хранимую
        программную единицу PL/SQL,  общий синоним, индекс  или кластер.
        Чтобы   переименовать   такой   объект,   вы   должны  удалить и
        пересоздать его.








                                        Управление объектами схемы  8-61


        Прежде  чем  переименовывать  объект  схемы, примите во внимание
        следующие эффекты этого действия:

            *  Все  обзоры  и  программные  единицы PL/SQL, зависимые от
               переименовываемого объекта, становятся  недействительными
               (должны   быть    перекомпилированы   перед    дальнейшим
               использованием).    Обратитесь   к   странице   8-75  для
               информации   о   том,   как   ORACLE   управляет   такими
               зависимостями.

            *  Все  синонимы   переименованного  объекта   остаются,  но
               возвращают ошибку при обращении к ним.

Привилегии, требуемые для переименования объекта

        Чтобы переименовать объект, вы должны быть его владельцем.


Анализ таблиц, индексов и кластеров
-----------------------------------

        Вы  можете  проанализировать  таблицу  (некластеризованную   или
        кластеризованную), индекс или кластер, чтобы собрать  информацию
        об этом объекте, или  чтобы проверить достоверность его  формата
        хранения.

            *  Таблицу, индекс  или кластер  можно проанализировать  для
               сбора  или  обновления  статистики  об  объекте.    Когда
               выдается предложение  DML, статистика  для адресуемых  им
               объектов    используется    для    определения   наиболее
               эффективного  плана  исполнения  для  этого  предложения;
               такая оптимизация называется "стоимостной  оптимизацией".
               Эта  статистика  сохраняется  в  словаре  данных.    (Для
               дополнительной информации об  анализе таблиц, индексов  и
               кластеров для сбора статистики, а также об  оптимизаторе,
               обратитесь   к   документу   ORACLE7   Server Application
               Developer's Guide.)

            *  Таблицу, индекс  или кластер  можно проанализировать  для
               проверки  целостности  структуры  объекта.   Например,  в
               редких  случаях  (из-за  аппаратных  или системных сбоев)
               индекс  может  стать  запорченным  и  некорректным;   при
               проверке  индекса  вы  можете  удостовериться, что каждая
               запись   индекса    указывает   на    корректную   строку
               ассоциированной таблицы.   Если схема  объекта запорчена,
               вы можете удалить и пересоздать ее.

            *  Таблицу или кластер можно проанализировать для  получения
               информации о цепочках строк в таблице или кластере.   Эта
               информация  полезна   для  определения,   имеете  ли   вы
               достаточно  места  для  обновлений  существующих   строк;
               например, она может  показывать, правильно ли  установлен
               процент PCTFREE для таблицы или кластера.

Обновление и удаление статистики для таблиц, индексов и кластеров

        Статистика  о   физических  характеристиках   хранения  таблицы,
        индекса или  кластера может  быть собрана  и помещена  в словарь
        данных с помощью команды SQL ANALYZE с опцией STATISTICS.  Такая
        статистика  может  использоваться   ORACLE,  когда  для   выбора
        наиболее   эффективного   плана   исполнения   предложений  SQL,
        обращающихся  к   анализируемым  объектам,   используется  режим

8-62  Руководство администратора


        стоимостной   оптимизации.    Администратор   базы   данных  или
        разработчик  приложений  также  может  использовать  статистику,
        генерируемую   этой   командой,   для   написания    эффективных
        предложений SQL, обращающихся к анализируемым объектам.

        С помощью команды ANALYZE  можно как вычислять, так  и оценивать
        статистику, как определяют  опции COMPUTE STATISTICS  и ESTIMATE
        STATISTICS соответственно:

            *  Когда вычисляется статистика, весь объект просматривается
               для сбора  данных о  нем.  Затем  эти данные используются
               ORACLE для  вычисления точной  статистики об  объекте.  В
               такой   статистике   учитываются   даже    незначительные
               изменения в объекте.  Поскольку для вычисления статистики
               просматривается  весь  объект  целиком,  время выполнения
               этой операции пропорционально размеру объекта.

            *  Когда    оценивается    статистика,    ORACLE    собирает
               репрезентативную информацию, просматривая отдельные части
               объекта.   Это  подмножество  информации используется для
               предоставления   приемлемой   оценочной   статистики   об
               объекте.    Точность    этой   статистики    зависит   от
               репрезентативности   выборок,   осуществляемых    ORACLE.
               Поскольку  при  сборе  информации  для  оценки статистики
               просматриваются  лишь   части  объекта,   анализ  объекта
               выполняется быстро.  Вы  можете по желанию  указать число
               строк, которые ORACLE должен просмотреть для оценки.

        Вычисленная  или  оцененная  статистика  сохраняется  в  словаре
        данных.  Эту статистику можно опрашивать через следующие  обзоры
        словаря данных:

            *  USER_INDEXES, ALL_INDEXES, DBA_INDEXES
            *  USER_TABLES, ALL_TABLES, DBA_TABLES
            *  USER_TAB_COLUMNS, ALL_TAB_COLUMNS, DBA_TAB_COLUMNS

        Замечание:  Эти  обзоры  содержат  записи  (строки) лишь для тех
        индексов,   таблиц   и   кластеров,   для   которых  вы собирали
        статистику.   Эти  записи  обновляются  для  объекта каждый раз,
        когда вы выполняете команду ANALYZE для этого объекта.

        Вы можете собирать следующую статистику по таблице:

            *  число строк

            *  число используемых блоков (только вычисляемая)

            *  число никогда не использовавшихся блоков

            *  среднее доступное свободное пространство

            *  число сцепленных строк

            *  средняя длина строки









                                        Управление объектами схемы  8-63


            *  число различающихся значений на столбец

            *  второе наименьшее значение на столбец (только
               вычисляемая)

            *  второе наибольшее значение на столбец (только
               вычисляемая)

        Замечание:  При  анализе  таблицы  для  статистики автоматически
        собирается статистика для всех ассоциированных с ней индексов.

        Вы можете собирать следующую статистику по индексу:

            *  уровень индекса (только вычисляемая)

            *  число блоков листьев

            *  число различных ключей

            *  среднее число блоков листьев на ключ

            *  среднее число блоков данных на ключ

            *  фактор кластеризации

            *  минимальное значение ключа (только вычисляемая)

            *  максимальное значение ключа (только вычисляемая)

        Единственная статистика, собираемая для кластера, - это  средняя
        длина  цепочки  для  ключа  кластера;  эту  статистику можно как
        вычислять, так и оценивать.  Статистика для таблиц в кластере  и
        всех ассоциированных с  ними индексов (включая  индекс кластера)
        автоматически собирается при анализе кластера для статистики.

        Замечание:  Если  в  словаре  данных  уже  есть  статистика   по
        анализируемому  объекту,   то  команда   ANALYZE  заменяет   эту
        статистику новой статистикой.

    Вычисление статистики

        Следующее предложение вычисляет статистику для таблицы EMP:

        ANALYZE TABLE emp COMPUTE STATISTICS;

    Оценка статистики для объекта схемы

        Следующее  предложение  оценивает  статистику  для  таблицы EMP,
        используя умалчиваемую статистическую выборку из 1064 строк:

        ANALYZE TABLE emp ESTIMATE STATISTICS;

        Чтобы  явно  специфицировать  статистическую  выборку,   которую
        должен   использовать   ORACLE,   включите   с   опцией ESTIMATE
        STATISTICS  опцию  SAMPLE.    Вы  можете  задать   целое  число,
        указывающее либо количество строк или значений индекса, либо  их
        процент  от  общего  размера  таблицы.   Следующие   предложения
        показывают примеры каждой возможности:

        ANALYZE TABLE emp
          ESTIMATE STATISTICS
            SAMPLE 2000 ROWS;

8-64  Руководство администратора


        ANALYZE TABLE emp
          ESTIMATE STATISTICS
            SAMPLE 33 PERCENT;

        В любом  случае, если  вы задаете  процент, превышающий  50, или
        число  строк  или  значений  индекса,  превышающее 50% от общего
        числа, то ORACLE вычисляет точную статистику вместо оценочной.

    Удаление статистики для объекта схемы

        Для удаления  из словаря  данных статистики  по таблице, индексу
        или  кластеру  используйте  команду  ANALYZE  с  опцией   DELETE
        STATISTICS.   Так,  вы  можете  захотеть  удалить  статистику по
        объекту,  если  не  хотите  использовать  стоимостной  подход  к
        оптимизации  предложений  SQL,  обращающихся  к  этому  объекту.
        Например,  следующее  предложение  удаляет  из  словаря   данных
        статистику для таблицы EMP:

        ANALYZE TABLE emp DELETE STATISTICS;

    Разделяемый SQL и анализ статистики

        Анализ таблицы, кластера или  индекса может повлиять на  текущие
        разделяемые предложения SQL  (предложения, находящиеся в  данный
        момент в разделяемом пуле).  При каждом анализе объекта с  целью
        обновления или удаления статистики, все разделяемые  предложения
        SQL, ссылающиеся на анализируемый объект, вытесняются из памяти,
        так   что   очередное   выполнение   такого   предложения сможет
        воспользоваться новой статистикой.

    Анализ статистики для словаря данных

        Чтобы  использовать  стоимостную  оптимизацию  для  внутренних и
        рекурсивных  вызовов  SQL,  вы  должны  обеспечить, чтобы ORACLE
        собрал статистику по словарю данных, и чтобы эта статистика была
        свежей.  Если статистика  по словарю данных  отсутствует, ORACLE
        использует регулярную оптимизацию по таким вызовам.

        Если  у  вас  ORACLE  с  процедурной  опцией, вы можете вызывать
        следующие процедуры:

        DBMS_UTILITY.           Эта процедура  принимает два  аргумента,
        ANALYZE_SCHEMA()        имя  схемы  и  метод анализа ('COMPUTE',
                                'ESTIMATE'  или  'DELETE'),  и  собирает
                                статистику по всем объектам в схеме.

        DBMS_UTILITY.           Эта процедура  принимает 4  аргумента, -
        ANALYZE_OBJECT()        тип  объекта  ('CLUSTER',  'TABLE'   или
                                'INDEX'), имя схемы, имя объекта и метод
                                анализа   ('COMPUTE',   'ESTIMATE'   или
                                'DELETE'),  и  собирает  статистику   по
                                объекту.

        Вы должны периодически  вызывать эти процедуры,  чтобы обновлять
        статистику.








                                        Управление объектами схемы  8-65


        Независимо от того,  имеете ли вы  процедурную опцию ORACLE,  вы
        можете  альтернативно  запускать  скрипт  CATSTAT.SQL,   который
        собирает  статистику   по  объектам   словаря  данных.    Как  и
        процедуры, перечисленные выше, вы должны периодически  выполнять
        этот  скрипт,  чтобы  обновлять  статистику.  Для дополнительной
        информации см. секуию "Создание дополнительных структур  словаря
        данных" на странице 2-16.


Проверка достоверности таблиц, индексов и кластеров

        Для проверки  целостности структуры  таблицы, индекса,  кластера
        или снимка используйте опцию VALIDATE STRUCTURE команды ANALYZE.
        Если структура корректна,  команда выполняется успешно.   Однако
        если  структура  запорчена,  возвращается  сообщение  об ошибке.
        (Если запорчены таблица, индекс или кластер, вы должны удалить и
        пересоздать  их.    Если  запорчен   снимок,  выполните   полное
        освежение  и  повторите  проверку;  если  проблема не устранена,
        удалите и пересоздайте снимок.)

        Например, следующее предложение проверяет таблицу EMP:

        ANALYZE TABLE emp VALIDATE STRUCTURE;

        Вы  можете  проверить  объект  и  все  связанные  с ним объекты,
        включив   опцию   CASCADE.    Например,   следующее  предложение
        проверяет таблицу EMP и все ассоциированные с ней индексы:

        ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE;


Просмотр цепочек строк таблиц и кластеров

        Цепочки строк (и  миграции строк) в  таблице или кластере  можно
        легко обнаружить с помощью  параметра LIST CHAINED ROWS  команды
        ANALYZE.   Результаты  этой  команды  сохраняются  в   указанной
        таблице,   которая   явно   создается   для   приема информации,
        возвращаемой этой разновидностью команды ANALYZE.

        Чтобы создать таблицу  для приема данных,  возвращаемых командой
        ANALYZE ...  LIST CHAINED ROWS, используйте скрипт UTLCHAIN.SQL,
        поставляемый  вместе  с  ORACLE.   Скрипт  UTLCHAIN.SQL  создает
        таблицу с именем CHAINED_ROWS в схеме пользователя, запускающего
        этот скрипт.  Имя и местоположение скрипта UTLCHAIN.SQL  зависит
        от  операционной  системы;  обратитесь  к  вашему руководству по
        инсталляции [IUG].

        После  того,  как   создана  таблица  CHAINED_ROWS,   вы  можете
        специфицировать ее  при выполнении  команды ANALYZE.   Например,
        следующее  предложение  заносит  информацию  о  цепочках   строк
        кластера EMP_DEPT в таблицу CHAINED_ROWS:

        ANALYZE CLUSTER emp_dept LIST CHAINED ROWS INTO chained_rows;










8-66  Руководство администратора


        Для дополнительной информации о том, как бороться с цепочками  и
        миграцией строк в таблицах  и кластерах, обратитесь к  документу
        ORACLE7 Server Application Developer's Guide.


Привилегии, требуемые для анализа таблиц, индексов и кластеров

        Чтобы  анализировать  таблицу,  индекс  или  кластер,  вы должны
        владеть этим  объектом, или  иметь системную  привилегию ANALYZE
        ANY.


Усечение таблиц и кластеров
---------------------------

        Вы  можете  захотеть  удалить  все  строки таблицы или кластера,
        чтобы  таблица  (или  кластер)  осталась  существовать, но стала
        полностью  пустой.    Например,  у   вас  может   быть  таблица,
        содержащая  месячные  данные,  и  в  конце  каждого  месяца  вам
        требуется опустошать ее после архивирования ее данных.

        Чтобы удалить все строки из таблицы, вы имеете три возможности:

            *  Вы  можете  удалить  строки  таблицы  с  помощью  команды
               DELETE.   Например,  следующее  предложение  удаляет  все
               строки из таблицы EMP:

               DELETE FROM emp;

            *  Вы  можете  удалить  и  пересоздать  таблицу.   Например,
               следующие предложения удаляют и пересоздают таблицу EMP:

               DROP TABLE emp;
               CREATE TABLE emp ( . . . );

            *  Вы можете  удалить все  строки таблицы  с помощью команды
               SQL  TRUNCATE.   Например,  следующее предложение усекает
               таблицу EMP:

               TRUNCATE TABLE emp;

        Первая    возможность,    команда    DELETE,    имеет  несколько
        особенностей, которые могут быть или не быть желательными.  Если
        в таблице  (или кластере)  много строк,  то удаление  всех строк
        таблицы и ассоциированных с ней индексов потребляет значительные
        системные ресурсы  (например, время  процессора, пространство  в
        журнале  повторения  и  в  сегментах  отката).   Кроме того, при
        удалении  каждой  строки  могут  возбуждаться триггеры.  Память,
        ранее распределенная таблице или кластеру, остается связанной  с
        этим объектом после удаления строк.

        Второй  способ,  удаление  и  пересоздание таблицы или кластера,
        также имеет  несколько особенностей.   Так, все  ассоциированные
        индексы, ограничения целостности и триггеры тоже удаляются,  все
        объекты, зависящие  от удаляемой  таблицы (или  кластеризованной
        таблицы),  становятся   недействительными,  и   все  гранты   на
        привилегии для удаляемой таблицы удаляются.






                                        Управление объектами схемы  8-67


        По  контрасту  с  этим,  команда TRUNCATE предоставляет быстрый,
        эффективный метод удаления всех  строк из таблицы или  кластера.
        Предложение TRUNCATE не генерирует никакой информации отката,  и
        подверждается немедленно;  оно является  предложением DDL,  и не
        может  быть   подвергнуто  откату.    Предложение  TRUNCATE   не
        затрагивает ни  структур, ассоциированных  с усекаемой  таблицей
        (ограничений   или   триггеров),   ни   полномочий    (грантов).
        Предложение TRUNCATE также позволяет специфицировать, должна  ли
        быть освобождена память, распределенная для усекаемой таблицы.

        Когда  предложение  TRUNCATE  удаляет  строки  из  таблицы  (или
        кластеризованной  таблицы),  триггеры,  ассоциированные  с  этой
        таблицей, не возбуждаются.  Кроме того, предложение TRUNCATE  не
        генерирует  никакой   аудиторской  информации,   соответствующей
        предложениям DELETE, даже если включен режим аудитинга.   Вместо
        этого  генерируется  единственная  аудиторская  запись  на   все
        предложение TRUNCATE.   (Для информации  об аудитинге  см. главу
        13.)

        Хэш-кластер не  может быть  усечен.  Кроме  того, нельзя усекать
        индивидуальные  таблицы   в  индексированном   или  хэшированном
        кластере; усечение индексированного кластера удаляет все  строки
        из всех  таблиц в  этом кластере.   Если необходимо  удалить все
        строки из  индивидуальной кластеризованной  таблицы, используйте
        команду DELETE, либо удалите и пересоздайте таблицу.

        Опции   REUSE   STORAGE   или   DROP   STORAGE  команды TRUNCATE
        определяют, должна  ли быть  освобождена память,  распределенная
        для  усекаемой  таблицы.   Умалчиваемая  опция,  DROP   STORAGE,
        сокращает   число   экстентов,   распределенных   результирующей
        таблице,  до  первоначального  значения MINEXTENTS; освбождаемые
        экстенты   возвращаются   в   табличное   пространство   и могут
        использоваться  другими  объектами.   Альтернативно, опция REUSE
        STORAGE указывает, что вся память, которая была занята усекаемой
        таблицей   или   кластером,   должна   остаться  распределенной.
        Например,  следующее   предложение  усекает   кластер  EMP_DEPT,
        сохраняя за ним все распределенные экстенты:

        TRUNCATE CLUSTER emp_dept REUSE STORAGE;

        Опции REUSE STORAGE  или DROP STORAGE  применяются также ко  все
        ассоциированным индексам; при усечении таблицы или кластера  все
        ассоциированные индексы  также усекаются.   Заметьте также,  что
        параметры памяти для  таблицы или кластера  (или ассоциированных
        индексов) не изменяются в результате усечения.


Привилегии и условия, требуемые для усечения таблицы или кластера

        Пользователь может  усекать любую  таблицу или  кластер в  своей
        схеме.  Пользователь,  имеющий системуню  привилегию DELETE  ANY
        TABLE, может  усекать Пользователь  может усекать  любую таблицу
        или кластер в любой схеме.










8-68  Руководство администратора


        Прежде чем  усекать таблицу  (или кластер,  содержащий таблицу),
        которая  содержит  родительский  ключ,  следует  отключить   все
        ссылающиеся   на   этот   ключ   ограничения   внешних   ключей;
        самоссылочные ограничения отключать не требуется.


Включение и выключение триггеров
--------------------------------

        Триггер может находиться в одном из двух режимов:

        включен         Включенный  триггер  выполняет  свое  тело, если
                        выдано  предложение   триггера,  и   ограничение
                        триггера (если есть) вычисляется как TRUE.

        выключен        Выключенный триггер не выполняет свое тело, даже
                        если выдано предложение триггера, и  ограничение
                        триггера (если есть) вычисляется как TRUE.


Отключение триггеров

        Вы можете временно отключить  триггер, если имеет место  одно из
        следующих условий:

            *  Объект, к которому обращается триггер, недоступен.

            *  Вы должны  выполнить массовую  загрузку данных,  и хотите
               осуществить ее быстро, не возбуждая триггеров.

            *  Вы  загружаете  данные  в  таблицу, к которой применяется
               триггер.

        По умолчанию, триггер включается  в момент его создания.   Чтобы
        отключить триггер,  используйте команду  ALTER TRIGGER  с опцией
        DISABLE.   Например,  следующее  предложение  отключает  триггер
        REORDER по таблице INVENTORY:

        ALTER TRIGGER reorder DISABLE;

        Вы можете одновременно отключить все триггеры, ассоциированные с
        таблицей, с помощью команды ALTER TABLE с опциями DISABLE и  ALL
        TRIGGERS.    Например,   следующее   предложение   отключает все
        триггеры, определенные для таблицы INVENTORY:

        ALTER TABLE inventory
            DISABLE ALL TRIGGERS;

Включение триггеров

        Закончив задачу, для которой потребовалось отключать триггер, вы
        можете снова включить его.

        Чтобы  включить  триггер,  используйте  команду  ALTER TRIGGER с
        опцией ENABLE.  Например, следующее предложение включает триггер
        REORDER по таблице INVENTORY:

        ALTER TRIGGER reorder ENABLE;

        Вы можете одновременно включить все триггеры, ассоциированные  с
        таблицей, с помощью команды ALTER  TABLE с опциями ENABLE и  ALL
        TRIGGERS.    Например,   следующее   предложение   включает  все

                                        Управление объектами схемы  8-69


        триггеры, определенные для таблицы INVENTORY:

        ALTER TABLE inventory
            ENABLE ALL TRIGGERS;


Привилегии, требуемые для включения и выключения триггеров

        Для включения  и выключения  триггеров с  помощью команды  ALTER
        TABLE, вы  должны либо  владеть таблицей,  либо иметь  объектную
        привилегию  ALTER  TABLE  для  таблицы  или системную привилегию
        ALTER ANY TABLE.   Для включения или  выключения индивидуального
        триггера с помощью команды ALTER TRIGGER, вы должны либо владеть
        триггером, либо иметь системную привилегию ALTER ANY TRIGGER.


Управление ограничениями целостности
------------------------------------

        Эта секция объясняет механизмы  и процедуры ручного включения  и
        отключения, а также удаления, ограничений целостности.

        Ограничение   целостности,   определенное   по   таблице,  может
        находиться в одном из двух режимов:

        включено        Когда  ограничение  включено,  правило,  которое
                        определено им,  действует на  значения данных  в
                        столбцах,     участвующих     в     ограничении.
                        Определение  ограничения   хранится  в   словаре
                        данных.

        выключено       Когда  ограничение  выключено,  правило, которое
                        определено им, не действует на значения данных в
                        столбцах,  участвующих  в  ограничении.   Тем не
                        менее,   определение   ограничения   остается  в
                        словаре данных.

        Ограничение целостности  можно рассматривать  как утверждение  о
        данных   в   базе   данных.    При   включенном  ограничении это
        утверждение всегда истинно.  Однако при выключенном  ограничении
        это утверждение может и не быть истинным, так как в базу  данных
        могут попасть данные, нарушающие ограничение целостности.

        Чтобы    действовали    правила,    определенные   ограничениями
        целостности,  эти  ограничения  должны  быть всегда включены.  В
        некоторых  ситуациях,  однако,  желательно  временно   отключать
        ограничения     целостности      таблицы     из      соображений
        производительности.  Например:

            *  при загрузке больших массивов данных в таблицу с  помощью
               SQL*Loader

            *  при   выполнении   пакетных   операций,    осуществляющих
               массированные  изменения  в  таблице  (например,   замену
               номера  каждого  сотрудника  путем  прибавления  1000   к
               существующему номеру)

            *  при импорте или экспорте таблицы

        Во   всех   этих   случаях   временное   отключение  ограничений
        целостности может улучшить производительность операции.


8-70  Руководство администратора


        Пока  ограничение  включено,  никакая  строка,  нарушающая   это
        ограничение,  не   может  быть   вставлена  в   таблицу.   Когда
        ограничение   выключено,   однако,   такие   строки   могут быть
        вставлены;  каждая  такая  строка  известна  как  ИСКЛЮЧЕНИЕ для
        данного  ограничения.   Пока  в  таблице  существуют  исключения
        ограничения, ЭТО  ОГРАНИЧЕНИЕ НЕ  МОЖЕТ БЫТЬ  ВКЛЮЧЕНО.  Строки,
        нарушающие   ограничение,   должны   быть   либо   удалены, либо
        обновлены, чтобы ограничение можно было включить.

        Вы   можете   идентифицировать   исключения   для    конкретного
        ограничения целостности  при попытке  включить это  ограничение.
        См. "Вывод исключений ограничений" на странице 8-73.


Особенности индексов, ассоциированных с ограничениями

        Индекс, ассоциированный с  ограничением UNIQUE или  PRIMARY KEY,
        автоматически  создается  ORACLE  при  включении  ограничения, и
        удаляется  при  выключении  или  удалении  ограничения;  во всех
        случаях  от  пользователя  не  требуется  никаких  действий   по
        управлению этим индексом.  Эти ассоциированные индексы влияют на
        то, как вы управляете ограничениями UNIQUE и PRIMARY KEY.

        При  отключении  или  удалении  ограничений целостности UNIQUE и
        PRIMARY KEY, рассмотрите следующие соображения:

            *  Индекс, ассоциированный с ограничением, будет удален  при
               отключении или удалении ограничения.

            *  Пока  существуют  включенные  ограничения внешних ключей,
               ссылающихся  на  первичный  или  уникальный  ключ,  вы не
               можете  отключить  или  удалить  ограничение  для   этого
               первичного или уникального ключа.

        При последующем включении или переопределении ограничения ORACLE
        заново создает индекс для этого ограничения.

        Так как  уникальные и  первичные ключи  имеют ассоциированные  с
        ними индексы,  вы должны  учитывать фактор  стоимости удаления и
        создания  индексов,  когда  решаете  вопрос  об  отключении  или
        удалении   ограничения    UNIQUE   или    PRIMARY   KEY.    Если
        ассоциированный индекс  для ограничения  UNIQUE или  PRIMARY KEY
        исключительно  велик,  вы   можете  сэкономить  время,   оставив
        ограничение   включенным,   вместо   того   чтобы   удалять,   а
        впоследствии создавать заново, большой индекс.


Включение и выключение ограничений целостности при их определении

        При  определении  ограничения  целостности  предложением  CREATE
        TABLE или ALTER  TABLE, оно может  быть либо включено  с помощью
        опции ENABLE, либо выключено  с помощью опции DISABLE.   Если ни
        одна  из  этих  опций  не  указана  при определении ограничения,
        ORACLE автоматически включает это ограничение.

    Включение ограничений при их определении

        Следующие предложения  CREATE TABLE  и ALTER  TABLE одновременно
        определяют и включают ограничения целостности:




                                        Управление объектами схемы  8-71


        CREATE TABLE emp (
            empno NUMBER(5) PRIMARY KEY, . . . ;

        ALTER TABLE emp
            ADD PRIMARY KEY (empno);

        Предложение ALTER TABLE, которое определяет и пытается  включить
        ограничение,  может  сбиться,  потому  что  существующие  строки
        таблицы  могут  нарушать  это  ограничение  целостности.  В этом
        случае предложение  откатывается, а  определение ограничения  не
        сохраняется   и   не   включается.    (См.    "Вывод  исключений
        ограничений" на странице 8-73.)

        Чтобы включить  ограничение UNIQUE  или PRIMARY  KEY (и  создать
        ассоциированный индекс), владельцу таблицы также необходима либо
        квота для табличного  пространства, в котором  будет содержаться
        индекс, либо системная привилегия UNLIMITED TABLESPACE.

    Выключение ограничений при их определении

        Следующие предложения  CREATE TABLE  и ALTER  TABLE одновременно
        определяют и выключают ограничения целостности:

        CREATE TABLE emp (
            empno NUMBER(5) PRIMARY KEY DISABLE, . . . ;

        ALTER TABLE emp
            ADD PRIMARY KEY (empno) DISABLE;

        Предложение  ALTER   TABLE,  которое   определяет  и   выключает
        ограничение,   никогда   не   сбивается   из-за   строк таблицы,
        нарушающих это ограничение целостности.  Определение ограничения
        разрешается, так как его правило остается выключенным.


Включение и выключение существующих ограничений целостности

        С помощью команды ALTER TABLE можно:

            *  включить выключенное ограничение (фразой ENABLE)

            *  выключить включенное ограничение (фразой DISABLE)

    Включение выключенных ограничений

        Следующие   предложения    включают   выключенные    ограничения
        целостности:

        ALTER TABLE dept
            ENABLE CONSTRAINT dname_ukey;
        ALTER TABLE dept
            ENABLE PRIMARY KEY,
            ENABLE UNIQUE (dname, loc);

        Предложение ALTER TABLE,  которое пытается включить  выключенное
        ограничение,  может  сбиться,  потому  что  существующие  строки
        таблицы  могут  нарушать  это  ограничение  целостности.  В этом
        случае предложение  откатывается, а  ограничение не  включается.
        (См.  "Вывод исключений ограничений" на странице 8-73.)




8-72  Руководство администратора


        Чтобы включить  ограничение UNIQUE  или PRIMARY  KEY (и  создать
        ассоциированный индекс), владельцу таблицы также необходима либо
        квота для табличного  пространства, в котором  будет содержаться
        индекс, либо системная привилегия UNLIMITED TABLESPACE.

    Выключение включенных ограничений

        Следующие   предложения    выключают   включенные    ограничения
        целостности:

        ALTER TABLE dept
            DISABLE CONSTRAINT dname_ukey;
        ALTER TABLE dept
            DISABLE PRIMARY KEY,
            DISABLE UNIQUE (dname, loc);

        Чтобы одновременно выключить или удалить ограничение UNIQUE  или
        PRIMARY KEY  и все  зависимые от  него ограничения  FOREIGN KEY,
        используйте опцию CASCADE в фразах DISABLE или DROP.   Например,
        следующее предложение  отключает ограничение  PRIMARY KEY  и все
        зависимые от него ограничения FOREIGN KEY:

        ALTER TABLE dept
            DISABLE PRIMARY KEY CASCADE;


Удаление ограничений целостности

        Вы можете  удалить ограничение  целостности, если  оно больше не
        нужно, или  если его  правило перестало  быть справедливым.  Для
        удаления ограничения  используйте команду  ALTER TABLE  с фразой
        DROP.   Например,  следующие  предложения  удаляют   ограничения
        целостности:

        ALTER TABLE dept
            DROP UNIQUE (dname, loc);
        ALTER TABLE emp
            DROP PRIMARY KEY,
            DROP CONSTRAINT dept_fkey;

    Удаление ограничений UNIQUE и PRIMARY KEY

        Удаление   ограничений    UNIQUE   и    PRIMARY   KEY    удаляет
        ассоциированные индексы.  Кроме того, если существуют включенные
        ограничения  FOREIGN  KEY,  ссылающиеся  на данный первичный или
        уникальный ключ, то вы должны включить в предложение DROP  фразу
        CASCADE CONSTRAINTS, - в  противном случае вы не  можете удалить
        это ограничение.


Вывод исключений ограничений

        Если при выдаче предложений  CREATE TABLE ...  ENABLE  или ALTER
        TABLE ...  ENABLE  не существует исключений,  то соответствующее
        ограничение  включается,  и  все  последующие  предложения   DML
        подвергаются проверке на включенное ограничение целостности.

        Если  при  включении   ограничения  существуют  исключения,   то
        возвращается   ошибка,   и   ограничение   целостности  остается
        выключенным.  Если предложение  не может быть  успешно выполнено
        из-за существования исключений  ограничения, то это  предложение


                                        Управление объектами схемы  8-73


        откатывается.  Если существуют исключения, вы не можете включить
        ограничение, пока строки, нарушающие ограничение, не будут  либо
        удалены, либо обновлены.

        Чтобы определить, какие строки нарушают ограничение целостности,
        включите  опцию  EXCEPTIONS  в  фразу  ENABLE предложения CREATE
        TABLE или  ALTER TABLE.   Опция EXCEPTIONS  помещает в указанную
        таблицу  ROWID,  имя  владельца  таблицы,  имя  таблицы  и   имя
        ограничения для каждой  строки таблицы, нарушающей  ограничение.
        Например, следующее предложение пытается включить первичный ключ
        таблицы   DEPT,   и,   если   существуют   исключения, поместить
        информацию о них в таблицу с именем EXCEPTIONS:

        ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO exceptions;

        Замечание: Вы должны создать соответствующую таблицу  исключений
        для приема информации от  опции EXCEPTIONS фразы ENABLE,  прежде
        чем включать  ограничение.  Можно  создать таблицу  ограничений,
        запустив  скрипт  UTLEXCPT.SQL.   (Точное  имя  и местоположение
        скрипта UTLEXCPT.SQL зависит от операционной системы; обратитесь
        к  вашему  руководству  по  инсталляции.)   Этот  скрипт создает
        таблицу с именем  EXCEPTIONS.  Вы можете  создать дополнительные
        таблицы исключений с разными именами, модифицируя и перезапуская
        этот скрипт.

        Если  в  показанном  выше  примере  в  таблице  DEPT  существуют
        повторяющиеся значения первичного  ключа, а ограничение  PRIMARY
        KEY по таблице  DEPT имеет имя  SYS_C00301, то приведенное  выше
        предложение  может  поместить  в  таблицу  EXCEPTIONS  следующие
        строки:

        SELECT * FROM exceptions;

        ROWID                OWNER      TABLE_NAME      CONSTRAINT
        -------------------  ---------  --------------  -----------
        000003A5.000C.0001   SCOTT      DEPT            SYS_C00301
        000003A5.000D.0001   SCOTT      DEPT            SYS_C00301

        Более  информативный  запрос  мог  бы  соединить  информацию  из
        таблицы   исключений   и    главной   таблицы,   чтобы    выдать
        действительные   строки,   нарушающие   указанное   ограничение.
        Например:

        SELECT deptno, dname, loc FROM dept, exceptions
            WHERE exceptions.constraint = 'SYS_C00301'
            AND dept.rowid = exceptions.row_id;

        DEPTNO     DNAME          LOC
        ---------- -------------- --------------
                10 ACCOUNTING     NEW YORK
                10 RESEARCH       DALLAS

        Все строки, нарушающие ограничение, должны быть либо  обновлены,
        либо  удалены  из  таблицы,  содержащей  это  ограничение.   При









8-74  Руководство администратора


        обновлении  исключений  вы  должны  заменять  значение,  которое
        нарушает ограничение, на значение, удовлетворяющее  ограничению,
        либо  на   пустое  значение   (если  это   разрешается).   После
        обновления  или  удаления  каждой  строки  исключения  в главной
        таблице,  следует  удалять  соответствующие  строки  в   таблице
        исключений, чтобы избежать  путаницы с последующими  отчетами об
        исключениях.  Предложения, обновляющие главную таблицу и таблицу
        исключений,   следует   помещать   в   одну   транзакцию,  чтобы
        гарантировать согласованность этих действий.

        Например, чтобы исправить исключения в предыдущем примере, можно
        выдать следующую транзакцию:

        UPDATE dept SET deptno = 20 WHERE dname = 'RESEARCH';
        DELETE FROM exceptions WHERE constraint = 'SYS_C00301';
        COMMIT;

        При  управлении  исключениями,  целью  является уничтожение всех
        исключений в вашей таблице исключений.

        Замечание: В  то время,  пока вы  исправляете текущие исключения
        для  таблицы  при  выключенном  ограничении, другие пользователи
        могут выдавать предложения, создающие новые исключения.


Управление зависимостями объектов
---------------------------------

        Следующая таблица показывает,  как влияют изменения  объектов на
        другие объекты, зависящие от изменяемых.

































                                        Управление объектами схемы  8-75


Табл.8-1
Операции, влияющие на состояние объекта

        г======================T===================T===================¬
        ¦ Операция             ¦ Результирующее    ¦ Результирующее со-¦
        ¦                      ¦ состояние объекта ¦ стояние зависимых ¦
        ¦                      ¦                   ¦ объектов          ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ CREATE таблица,      ¦ VALID (действи-   ¦ Без изменений*    ¦
        ¦  последовательность, ¦ тельное), если    ¦                   ¦
        ¦  синоним             ¦ нет ошибок        ¦                   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ ALTER таблица        ¦ VALID, если нет   ¦ INVALID           ¦
        ¦   [ADD | MODIFY стлб ¦ ошибок            ¦ (недействительное)¦
        ¦ RENAME табл., посл., ¦                   ¦                   ¦
        ¦  синоним, обзор      ¦                   ¦                   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ DROP таблица, посл., ¦ Никакого; объект  ¦ INVALID           ¦
        ¦ синоним, обзор, про- ¦ удален            ¦                   ¦
        ¦ цедура,функция,пакет ¦                   ¦                   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ CREATE обзор,        ¦ VALID, если нет   ¦ без изменений*    ¦
        ¦  процедура**         ¦ ошибок; INVALID   ¦                   ¦
        ¦                      ¦ при ошибках син-  ¦                   ¦
        ¦                      ¦ таксиса/полномочий¦                   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ CREATE OR REPLACE    ¦ VALID, если нет   ¦ INVALID           ¦
        ¦  обзор, процедура**  ¦ ошибок; INVALID   ¦                   ¦
        ¦                      ¦ при ошибках син-  ¦                   ¦
        ¦                      ¦ таксиса/полномочий¦                   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ REVOKE объектная при-¦ Без изменений     ¦ INVALID для всех  ¦
        ¦  вилегия*** ON объект¦                   ¦ зависимых объектов¦
        ¦  TO/FROM пользователь¦                   ¦ этого польз.***   ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ REVOKE объектная при-¦ Без изменений     ¦ INVALID для всех  ¦
        ¦  вилегия*** ON объект¦                   ¦ зависимых объектов¦
        ¦  TO/FROM PUBLIC      ¦                   ¦ в базе данных***  ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ REVOKE системная при-¦ Без изменений     ¦ INVALID для всех  ¦
        ¦  вилегия****         ¦                   ¦ объектов пользова-¦
        ¦  TO/FROM пользователь¦                   ¦ теля****          ¦
        ¦----------------------+-------------------+-------------------¦
        ¦ REVOKE системная при-¦ Без изменений     ¦ INVALID для всех  ¦
        ¦  вилегия****         ¦                   ¦ объектов в базе   ¦
        ¦  TO/FROM PUBLIC      ¦                   ¦ данных****        ¦
        L======================¦===================¦===================-

             * Может  вызывать  недействительность  зависимых  объектов,
               если объект не существовал ранее.

            ** Независимые процедуры и функции, пакеты и триггеры.

           *** Только объектные привилегии DML, включая SELECT,  INSERT,
               UPDATE,  DELETE  и  EXECUTE;  приведение в действительное
               состояние не требует перекомпиляции.

          **** Только системные привилегии DML, включая SELECT /  INSERT
               /  UPDATE  /  DELETE  ANY  TABLE и EXECUTE ANY PROCEDURE;
               приведение   в   действительное   состояние   не  требует
               перекомпиляции.


8-76  Руководство администратора


        ORACLE автоматически перекомпилирует недействительный обзор  или
        программную единицу PL/SQL при очередном обращении.  Кроме того,
        пользователь может заставить ORACLE перекомпилировать обзор  иди
        программную  единицу,   используя  подходящую   команду  SQL   с
        параметром     COMPILE.      Принудительная      (форсированная)
        перекомпиляция чаще всего используется для того, чтобы проверить
        на ошибки, пока зависимый объект недействителен, но временно  не
        используется; в таком  случае для автоматической  перекомпиляции
        пришлось бы дожидаться  очередного обращения к  объекту.  (Чтобы
        идентифицировать  недействительные  зависимые  объекты, опросите
        обзоры USER_/ALL_/DBA_OBJECTS).

Ручная перекомпиляция обзоров

        Чтобы перекомпилировать обзор, используйте команду ALTER VIEW  с
        параметром    COMPILE.     Например,    следующее    предложение
        перекомпилирует обзор EMP_DEPT, содержащийся в вашей схеме:

        ALTER VIEW emp_dept COMPILE;

    Привилегии, требуемые для ручной перекомпиляции обзоров
        Для  ручной  перекомпиляции  обзора  вы  должны либо иметь его в
        своей схеме, либо иметь системную привилегию ALTER ANY TABLE.

Ручная перекомпиляция процедур и функций

        Чтобы  перекомпилировать  независимую  процедуру  или   функцию,
        используйте  команду   ALTER  PROCEDURE/FUNCTION   с  параметром
        COMPILE.    Например,   следующее   предложение  перекомпилирует
        хранимую процедуру UPDATE_SALARY, содержащуюся в вашей схеме:

        ALTER PROCEDURE update_salary COMPILE;

    Привилегии, требуемые для ручной перекомпиляции процедур и функций
        Для ручной перекомпиляции  процедуры вы должны  либо иметь ее  в
        своей  схеме,  либо  обладать  системной  привилегией  ALTER ANY
        PROCEDURE.

Ручная перекомпиляция пакетов

        Чтобы  перекомпилировать   тело  пакета   или  тело   вместе  со
        спецификацией  пакета,  используйте  команду  ALTER  PACKAGE   с
        параметром    COMPILE.     Например,    следующие    предложения
        перекомпилируют  только  тело  и  тело  со  спецификацией пакета
        ACCT_MGMT, соответственно:

        ALTER PACKAGE acct_mgmt COMPILE BODY;
        ALTER PACKAGE acct_mgmt COMPILE PACKAGE;

    Привилегии, требуемые для ручной перекомпиляции пакетов
        Для  ручной  перекомпиляции  пакета  вы  должны либо иметь его в
        своей  схеме,  либо  обладать  системной  привилегией  ALTER ANY
        PROCEDURE.

Ручная перекомпиляция триггеров

        Чтобы  перекомпилировать  существующий  триггер,  независимо  от
        того, включен от или выключен, используйте команду ALTER TRIGGER
        с параметром COMPILE.  Например, следующее предложение форсирует
        компиляцию триггера с именем REORDER:

        ALTER TRIGGER reorder COMPILE;

                                        Управление объектами схемы  8-77


    Привилегии, требуемые для ручной перекомпиляции триггеров

        Для ручной перекомпиляции  триггера вы должны  либо иметь его  в
        своей  схеме,  либо  обладать  системной  привилегией  ALTER ANY
        TRIGGER.


Управление разрешением имен объектов
------------------------------------

        Имена объектов, кодируемые в предложениях SQL, могут состоять из
        нескольких компонент, разделенных точками.  ORACLE разрешает имя
        объекта, используя следующий алгоритм:

        1. ORACLE  пытается  квалифицировать  первую  компоненту  имени,
           заданного  в  предложении  SQL;  например,  в имени SCOTT.EMP
           первой компонентой является SCOTT.   Если в имени всего  одна
           компонента, она считается первой.

           a. В  текущей  схеме,   ORACLE  ищет  объект,   имя  которого
              совпадает  с  первой  компонентой  имени искомого объекта.
              Если ORACLE не может  найти такой объект, он  продолжает с
              шага 1b.

           b. Если объект не найден  в текущей схеме, ORACLE  ищет общий
              синоним,  совпадающий  с  первой  компонентой имени.  Если
              ORACLE не может найти такой синоним, он продолжает с  шага
              1c.

           c. Если  общий  синоним  не  найден,  ORACLE  ищет схему, имя
              которой  совпадает  с  первой  компонентой  имени искомого
              объекта.  Если ORACLE находит такую схему, он возвращается
              к шагу  1a, используя  теперь вторую  компоненту имени как
              искомый  объект  в  квалицифированной  схеме.  Если второй
              объект не может быть найден в квалифицированной схеме, или
              если  второй  компоненты  имени  нет,  ORACLE   возвращает
              ошибку.

              Если на шаге 1c не найдена схема, то объект не может  быть
              квалифицирован, и ORACLE возвращает ошибку.

        2. Объект   схемы   теперь   квалифицирован.    Все   оставшиеся
           компоненты имени должны соответствовать действительным частям
           найденного    объекта.     Например,    если    именем   было
           SCOTT.EMP.DEPTNO, и SCOTT квалифицируется как схема, а EMP  -
           как  таблица,  то   DEPTNO  должен  соответствовать   столбцу
           (поскольку   EMP   -   таблица).    Если   объект   EMP   был
           квалифицирован как  пакет, то  DEPTNO должен  соответствовать
           общей  константе,  переменной,  процедуре  или функции в этом
           пакете.

        Когда в распределенной базе данных используются глобальные имена
        объектов  (либо  явно,  либо  косвенно через синоним), локальный
        ORACLE  разрешает  эти  ссылки  локально; например, он разрешает
        синоним как глобальное имя объекта удаленной таблицы.   Частично
        разрешенное  предложение  передается  удаленной  базе  данных, и
        удаленный ORACLE завершает разрешение имени объекта, как описано
        выше.





8-78  Руководство администратора


Изменение параметров памяти для словаря данных
----------------------------------------------

        Если ваша база данных очень велика или содержит необычно большое
        число  объектов,   столбцов  таблиц,   определений  ограничений,
        пользователей или других определений, то может наступить момент,
        когда таблицы, составляющие  словарь данных, не  смогут получить
        дополнительных экстентов (например, когда таблица словаря данных
        запрашивает  очередной  экстент,  но  в  табличном  пространстве
        SYSTEM   нет   достаточной   непрерывной   памяти).    Если  это
        происходит, вы не сможете создавать новых объектов, даже если  в
        табличном пространстве, в  котором создается объект,  достаточно
        места  для  самого  объекта.   Чтобы  исправить эту ситуацию, вы
        можете изменить параметры памяти соответствующих таблиц  словаря
        данных, чтобы позволить им распределять больше экстентов,  точно
        так же, как вы изменяете параметры памяти для своих  собственных
        сегментов   (например,   путем   настройки   значений   NEXT или
        PCTINCREASE для таблицы словаря данных).

[!]     Замечание:   Будьте   особенно   осторожны,   когда    изменяете
        характеристики  памяти  для  объектов  словаря  данных.  Если вы
        выберете  неподходящие   характеристики,  вы   можете  повредить
        структуру  словаря  данных   и  оказаться  вынужденными   заново
        создавать всю базу данных.  Например, если вы установите нулевое
        значение  PCTINCREASE  для  таблицы  словаря  данных  USER$,   а
        значение  NEXT  зададите  равным  2K,  то  эта  таблица   быстро
        исчерпает лимит максимального числа экстентов для сегмента, и вы
        не сможете больше создавать пользователей или ролей, не прибегая
        к экспорту, пересозданию и импорту всей базы данных.

Структуры в словаре данных

        Следующие таблицы и кластеры содержат определения всех объектов,
        создаваемых пользователями в базе данных:

        SEG$            сегменты,  определенные  в  базе данных (включая
                        временные сегменты)

        OBJ$            пользовательские объекты в базе данных  (включая
                        кластеризованные     таблицы);     индексируется
                        индексами I_OBJ1 и I_OBJ2

        UNDO$           сегменты  отката,  определенные  в  базе данных;
                        индексируется индексом I_UNDO1

        FET$            доступные свободные экстенты, не  распределенные
                        никаким сегментам

        UET$            экстенты, распределенные сегментам
        TS$             табличные  пространства,  определенные  в   базе
                        данных

        FILE$           файлы, составляющие  базу данных;  индексируется
                        индексом I_FILE1

        TAB$            таблицы,  определенные  в  базе  данных (включая
                        кластеризованные     таблицы);     индексируется
                        индексом I_TAB1

        CLU$            кластеры, определенные в базе данных
        IND$            индексы,    определенные    в    базе    данных;
                        индексируется индексом I_IND1

                                        Управление объектами схемы  8-79


        ICOL$           столбцы, по которым определены индексы  (включая
                        индивидуальные записи  для столбцов,  входящих в
                        составные   индексы);   индексируется   индексом
                        I_ICOL1

        COL$            столбцы,  определенные  в  таблицах базы данных;
                        индексируется индексами I_COL1 и I_COL2

        CON$            ограничения, определенные в базе данных (включая
                        информацию  об  их  владельцах);   индексируется
                        индексами I_CON1 и I_CON2

        CDEF$           определения  ограничений  в  CON$; индексируется
                        индексами I_CDEF1, I_CDEF2 и I_CDEF3

        CCOL$           столбцы,  по   которым  определены   ограничения
                        (включая  индивидуальные  записи  для  столбцов,
                        входящих  в   составные  ключи);   индексируется
                        индексом I_CCOL1

        USER$           пользователи и роли, определенные в базе данных;
                        индексируется индексом I_USER1

        TSQ$            квоты  табличных  пространств  для пользователей
                        (одна  запись  на   каждую  квоту  для   каждого
                        пользователя)

        C_OBJ#          кластер, содержащий  таблицы TAB$,  CLU$, ICOL$,
                        IND$ и COL$; индексируется индексом I_OBJ#

        C_TS#           кластер, содержащий таблицы  FET$, TS$ и  FILE$;
                        индексируется индексом I_TS#

        C_FILE#_BLOCK#  кластер,   содержащий   таблицы   SEG$   и UET$;
                        индексируется индексом I_FILE#_BLOCK#

        C_USER#         кластер,  содержащий   таблицы  USER$   и  TSQ$;
                        индексируется индексом I_USER#

        C_COBJ#         кластер,  содержащий  таблицы  CDEF$  и   CCOL$;
                        индексируется индексом I_COBJ#


        Из всех сегментов словаря  данных, наиболее вероятно, вы  будете
        изменять следующие сегменты:

            *  C_TS#, если свободная память  в вашей базе данных  сильно
               фрагментирована

            *  C_OBJ#,  если  у  вас  слишком  много  индексов или много
               столбцов в ваших таблицах

            *  CON$   и   C_COBJ#,   если   вы   интенсивно  используете
               ограничения целостности

            *  C_USER#,  если  у  вас  в  базе  данных  определено много
               пользователей

        Для кластеризованных таблиц,  вы должны изменять  характеристики
        памяти для всего кластера, а не для индивидуальной таблицы.



8-80  Руководство администратора


Ошибки, требующие изменений памяти словаря данных

        ORACLE  возвращает  ошибку,  если  пользователь пытается создать
        новый объект, требующий распредеделения дополнительного экстента
        словарю данных,  но ORACLE  не может  распределить этот экстент.
        Этот  тип  проблемы   отмечается  ошибкой  ORA-1547   ("не  могу
        распределить  экстент  размера  nnn  в  табличном   пространстве
        'имя'").

        Если вы получили такое  сообщение об ошибке, а  сегмент, который
        вы пытаетесь изменить (например, таблица или сегмент отката) еще
        не  достиг  пределов,  заданных  в  его  определении,  проверьте
        характеристики памяти для того объекта словаря данных, в котором
        содержится определение вашего объекта.

        Например, если вы получили ORA-1547 при попытке определить новое
        ограничение PRIMARY KEY  по таблице, и  у вас достаточно  памяти
        для индекса, который ORACLE должен создать для этого  первичного
        ключа, то проверьте CON$ или  C_COBJ#, - может быть, экстент  не
        может  быть  распределен  для  них;  чтобы сделать это, опросите
        DBA_SEGMENTS   (см.    "Вывод   сегментов,   которые   не  могут
        распределить  дополнительных  экстентов"  на  странице  8-84), и
        рассмотрите необходимость изменения  параметров памяти для  CON$
        или C_COBJ#.


Вывод информации об объектах схемы
----------------------------------

        Словарь   данных   предлагает   много   обзоров, предоставляющих
        информацию об объектах схем, которые были описаны в этой  главе.
        Следующий список суммирует обзоры, связанные с объектами схем:

            *  ALL_OBJECTS, USER_OBJECTS, DBA_OBJECTS

            *  ALL_CATALOG, USER_CATALOG, DBA_CATALOG

            *  ALL_TABLES, USER_TABLES, DBA_TABLES

            *  ALL_TAB_COLUMNS, USER_TAB_COLUMNS, DBA_TAB_COLUMNS

            *  ALL_TAB_COMMENTS, USER_TAB_COMMENTS

            *  ALL_COL_COMMENTS, USER_COL_COMMENTS, DBA_COL_COMMENTS

            *  ALL_VIEWS, USER_VIEWS, DBA_VIEWS

            *  ALL_INDEXES, USER_INDEXES, DBA_INDEXES

            *  ALL_IND_COLUMNS, USER_IND_COLUMNS, DBA_IND_COLUMNS

            *  USER_CLUSTERS, DBA_CLUSTERS

            *  USER_CLU_COLUMNS, DBA_CLU_COLUMNS

            *  ALL_SEQUENCES, USER_SEQUENCES, DBA_SEQUENCES

            *  ALL_SYNONYMS, USER_SYNONYMS, DBA_SYNONYMS

            *  ALL_DEPENDENCIES, USER_DEPENDENCIES, DBA_DEPENDENCIES



                                        Управление объектами схемы  8-81


        Следующие обзоры словаря данных содержат информацию о  сегментах
        базы данных:

            *  USER_SEGMENTS

            *  DBA_SEGMENTS

        Следующие обзоры словаря данных содержат информацию об экстентах
        базы данных:

            *  USER_EXTENTS

            *  DBA_EXTENTS

            *  USER_FREE_SPACE

            *  DBA_FREE_SPACE

        Следующие  секции  приводят  примеры  использования некоторых из
        перечисленных выше обзоров.

Пример 1:
Вывод объектов схемы по типам

        Следующий запрос выдает все объекты, принадлежащие пользователю,
        который выдает этот запрос:

        SELECT object_name, object_type FROM user_objects;

        OBJECT_NAME               OBJECT_TYPE
        ------------------------- -------------------
        EMP_DEPT                  CLUSTER
        EMP                       TABLE
        DEPT                      TABLE
        EMP_DEPT_INDEX            INDEX
        PUBLIC_EMP                SYNONYM
        EMP_MGR                   VIEW

Пример 2:
Вывод информации о столбцах

        Информацию  о  столбцах,  такую  как  имя,  тип  данных,  длина,
        точность,  масштаб  и  умалчиваемые  значения,  можно получить с
        помощью обзоров, имеющих суффикс _COLUMNS.  Например,  следующий
        запрос выдает все умалчиваемые значения столбцов для таблиц  EMP
        и DEPT:

















8-82  Руководство администратора


        SELECT table_name, column_name, data_default
           FROM user_tab_columns
            WHERE table_name = 'DEPT' OR table_name = 'EMP';

        TABLE_NAME  COLUMN_NAME     DATA_DEFAULT
        ----------  --------------- --------------------
        DEPT        DEPTNO
        DEPT        DNAME
        DEPT        LOC             'NEW YORK'
        EMP         EMPNO
        EMP         ENAME
        EMP         JOB
        EMP         MGR
        EMP         HIREDATE        SYSDATE
        EMP         SAL
        EMP         COMM
        EMP         DEPTNO

        Заметьте, что не  для всех столбцов  определены пользовательские
        умолчания.    Для   таких   столбцов   умалчиваемым    значением
        автоматически считается NULL.

Пример 3:
Вывод зависимостей для обзоров и синонимов

        Когда  вы   создаете  обзор   или  синоним,   он  опирается   на
        соответствующий   базовый   объект.    Обзоры   словаря   данных
        ALL/USER/DBA_DEPENDENCIES  можно   использовать  для   получения
        информации о зависимостях для обзора, а ALL/USER/DBA_SYNONYMS  -
        для  показа  базового  объекта  синонима.   Например,  следующий
        запрос   выдает   базовые   объекты   для   синонимов, созданных
        пользователем JWARD:

        SELECT table_owner, table_name, synonym_name
          FROM sys.dba_synonyms
         WHERE owner = 'JWARD';

        TABLE_OWNER             TABLE_NAME   SYNONYM_NAME
        ----------------------- ------------ -----------------
        SCOTT                   DEPT         DEPT
        SCOTT                   EMP          EMP

Пример 4:
Вывод общей информации о сегментах

        Следующий запрос возвращает для каждого сегмента отката его имя,
        размер и табличное пространство, в котором он содержится:
















                                        Управление объектами схемы  8-83


        SELECT segment_name, tablespace_name, bytes, blocks, extents
            FROM sys.dba_segments
            WHERE segment_type = 'ROLLBACK';

        SEGMENT_NAME TABLESPACE_NAME      BYTES     BLOCKS    EXTENTS
        ------------ --------------- ---------- ---------- ----------
        RS1          SYSTEM               20480         10          2
        RS2          TS1                  40960         20          3
        SYSTEM       SYSTEM              184320         90          3

Пример 5:
Вывод общей информации об экстентах

        Общая  информация  о  текущих  распределенных  экстентах  в базе
        данных   содержится   в   обзоре   словаря   данных DBA_EXTENTS.
        Например,    следующий    запрос    идентифицирует     экстенты,
        ассоциированные  с  сегментами  отката,  и выдает размер каждого
        такого экстента:

        SELECT segment_name, bytes, blocks
            FROM sys.dba_extents
            WHERE segment_type = 'ROLLBACK';

        SEGMENT_NAME         BYTES     BLOCKS
        --------------- ---------- ----------
        RS1                  10240          5
        RS1                  10240          5
        SYSTEM               51200         25
        SYSTEM               51200         25
        SYSTEM               51200         25

        Заметьте, что сегмент  отката RS1 состоит  из двух экстентов  по
        10K, тогда как сегмент  отката SYSTEM состоит из  трех экстентов
        по 50K.

Пример 6:
Вывод свободной памяти (экстентов) в базе данных

        Информация  о  свободных  (не  распределенных никаким сегментам)
        экстентах  в  базе  данных  содержится  в  обзоре словаря данных
        DBA_FREE_SPACE.  Например, следующий запрос сообщает о свободной
        памяти,  доступной   в  каждом   табличном  пространстве   через
        свободные экстенты:

        SELECT tablespace_name, file_id, bytes, blocks
            FROM sys.dba_free_space;

        TABLESPACE_NAME         FILE_ID      BYTES     BLOCKS
        -------------------- ---------- ---------- ----------
        SYSTEM                        1    8120320       3965
        SYSTEM                        1      10240          5
        TS1                           2   10432512       5094

Пример 7:
Вывод сегментов, которые не могут распределить дополнительных экстентов

        Используя DBA_FREE_SPACE в  комбинации с обзорами  DBA_SEGMENTS,
        DBA_TABLES,  DBA_CLUSTERS,  DBA_INDEXES  и DBA_ROLLBACK_SEGS, вы
        можете  определить  сегменты,  которые  не  могут   распределить




8-84  Руководство администратора


        дополнительных  экстентов.   Сегмент  может  быть не в состоянии
        распределить  дополнительный  экстент  по  любой  из   следующих
        причин:

            *  Табличное  пространство,  содержащее  сегмент,  не  имеет
               достаточного места для очередного экстента.

            *  Сегмент  уже  имеет  максимальное  число  экстентов,  как
               зафиксировано в словаре данных (в SEG.MAX_EXTENTS).

            *  Сегмент  имеет  максимальное  число  экстентов,   которое
               позволяет  иметь  размер  блока  данных  (что  зависит от
               операционной системы).

        Следующий  запрос  возвращает  имена,  владельцев  и   табличные
        пространства для всех сегментов, которые удовлетворяют одному из
        перечисленных выше условий:

        SELECT seg.owner, seg.segment_name,
               seg.segment_type, seg.tablespace_name,
               DECODE(seg.segment_type,
                      'TABLE', t.next_extent,
                      'CLUSTER', c.next_extent,
                      'INDEX', i.next_extent,
                      'ROLLBACK', r.next_extent)
        FROM sys.dba_segments seg,
             sys.dba_tables t,
             sys.dba_clusters c,
             sys.dba_indexes i,
             sys.dba_rollback_segs r
        WHERE ((seg.segment_type = 'TABLE'
                AND seg.segment_name = t.table_name
                AND seg.owner = t.owner
                AND NOT EXISTS (SELECT tablespace_name
                                FROM dba_free_space free
                                WHERE free.tablespace_name =
                                      t.tablespace_name =
                                AND free.bytes >= t.next_extent))
        OR     (seg.segment_type = 'CLUSTER'
                AND seg.segment_name = c.cluster_name
                AND seg.owner = c.owner
                AND NOT EXISTS (SELECT tablespace_name
                                FROM dba_free_space free
                                WHERE free.tablespace_name =
                                      c.tablespace_name =
                                AND free.bytes >= c.next_extent))
        OR     (seg.segment_type = 'INDEX'
                AND seg.segment_name = i.cluster_name
                AND seg.owner = i.owner
                AND NOT EXISTS (SELECT tablespace_name
                                FROM dba_free_space free
                                WHERE free.tablespace_name =
                                      i.tablespace_name =
                                AND free.bytes >= i.next_extent))









                                        Управление объектами схемы  8-85


        OR     (seg.segment_type = 'ROLLBACK'
                AND seg.segment_name = r.cluster_name
                AND seg.owner = r.owner
                AND NOT EXISTS (SELECT tablespace_name
                                FROM dba_free_space free
                                WHERE free.tablespace_name =
                                      r.tablespace_name =
                                AND free.bytes >= r.next_extent)))
        OR seg.extents = seg.max_extents
        OR seg.extents = размер_блока_данных;

        Замечание:    Перед    выполнением    этого    запроса  замените
        "размер_блока_данных" на размер блока данных для вашей системы.

        После  того,  как  вы  идентифицируете  сегмент, для которого не
        может быть распределен дополнительный экстент, вы можете  решить
        эту  проблему  одним  из  двух  способов,  в  зависимости  от ее
        причины:

            *  Если переполнено табличное пространство, добавьте в  него
               файлы данных.  (См. главу 7.)

            *  Если  сегмент  имеет  слишком  много  экстентов,  а вы не
               можете увеличить значение MAXEXTENTS для этого  сегмента,
               выполните   следующие   шаги:   во-первых,  экспортируйте
               данные,  содержащиеся  в  сегменте;  во-вторых, удалите и
               пересоздайте сегмент, увеличив значение INITIAL, чтобы не
               было  необходимости  в  столь  большом числе экстентов; и
               в-третьих, импортируйте данные обратно в новый сегмент.


































8-86  Руководство администратора