УПРАВЛЕНИЕ ОБЪЕКТАМИ СХЕМЫ
 
        Эта  глава  обсуждает  процедуры,  необходимые  для  создания  и
        сопровождения  различных  типов  объектов,  содержащихся в схеме
        пользователя.   Темы  этой  главы  включают обсуждение следующих
        вопросов:
 
            *  процедуры для создания, управления и удаления объектов
               схемы
 
            *  переименование объектов схемы
 
            *  процедуры для управления использованием памяти в блоках
               данных
 
            *  разрешение имен объектов схемы
 
Управление таблицами
 
        Таблица -  это структура,  которая хранит  данные в  реляционной
        базе данных.  Таблица состоит из строк и столбцов.
        Таблица  может  представлять  единственную  сущность, которую вы
        хотите  отобразить  в   вашей  системе.   Такая   таблица  может
        представлять,  например,  список  сотрудников вашей организации,
        или заказы, размещенные на продукты вашей компании.
        Таблица   может   также   представлять   отношение   между двумя
        сущностями.    Такая   таблица   может,   например,   отображать
        ассоциацию между сотрудниками и их профессиями, или связи  между
        продуктами и заказами.  Внутри  таблиц, такие отношения и  связи
        представляются внешними ключами.
 
        Хотя некоторые  хорошо определенные  таблицы могут  одновременно
        как  представлять  сущность,  так  и  описывать связь между этой
        сущностью  и   другой  сущностью,   большинство  таблиц   должны
        представлять  либо  только  сущность,  либо  только   отношение.
        Например,  таблица  EMP  описывает  сотрудников  фирмы,  но  эта
        таблица   также   включает   внешний   ключ,   DEPTNO,   который
        представляет связь от сотрудников к отделам.
 
        Следующие секции  объясняют, как  создавать, изменять  и удалять
        таблицы.  Представлены  некоторые простые  рекомендации, которым
        необходимо  следовать  при  управлении  таблицами  в  вашей базе
        данных;  для  дополнительных  сведений  обратитесь  к  документу
        ORACLE7 Server Administrator's Guide.  Вы должны также прибегать
        к помощи  учебников по  проектированию реляционных  баз данных и
        таблиц.
 
Проектирование таблиц
---------------------
 
        Учитывайте  следующие  рекомендации  при  проектировании   ваших
        таблиц:
 
            *  Используйте  описательные  имена  для  таблиц, индексов и
               кластеров.
 
            *  Согласовывайте   сокращения,   а   также   единственную и
               множественную формы имен таблиц и столбцов.
 
            *  Документируйте назначение каждой таблицы и ее столбцов  с
               помощью команды COMMENT.
 
            *  Нормализуйте каждую таблицу.
 
            *  Выберите правильный тип данных для каждого столбца.
 
            *  Определяйте столбцы,  которые допускают  пустые значения,
               последними, чтобы экономить дисковую память.
 
            *  Кластеризуйте  таблицы,  когда  это  целесообразно, чтобы
               экономить     дисковую     память     и    оптимизировать
               производительность ваших предложений SQL.
 
        Прежде чем создавать таблицу, вы должны также определить, будете
        ли   вы   использовать   ограничения   целостности.  Ограничения
        целостности могут быть определены по столбцам вашей таблицы  для
        того, чтобы автоматически задействовать организационные  правила
        вашей  базы  данных;  для  соответствующих указаний обратитесь к
        главе 6.
 
Создание таблиц
---------------
 
        Создавайте  таблицы   с  помощью   команды  SQL   CREATE  TABLE.
        Например,  выдавая  следующее  предложение,  пользователь  SCOTT
        создает некластеризованную таблицу с именем 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 );
 
 
Управление использованием памяти для блоков данных
--------------------------------------------------
 
        Следующие секции объясняют, как использовать параметры PCTFREE и
        PCTUSED для выполнения следующих задач:
 
            *  повышения производительности записи и извлечения данных
               или индексов
 
            *  уменьшения объема неиспользуемой памяти в блоках данных
 
            *  уменьшения количества цепочек строк между блоками данных
 
 
Специфицирование PCTFREE
 
        Умолчание для  PCTFREE равно  10 процентов;  вы можете  задавать
        любое целое значение от 0 до 99 включительно, пока сумма PCTFREE
        и PCTUSED не превышает 100.  (Если вы установите PCTFREE как 99,
        то ORACLE  будет помещать  в каждый  блок по  меньшей мере  одну
        строку, независимо  от размера  этой строки.   Если строки очень
        малы,  а  блоки  очень  велики,  может уместиться даже несколько
        строк.)
 
        Низкое значение PCTFREE имеет следующие эффекты:
 
            *  резервирует  меньше  места  для  обновлений  существующих
               строк таблицы
 
            *  позволяет более полно заполнять блок вставками
 
                                         Управление объектами схемы  2-3
 
 
            *  может экономить  память, так  как все  данные таблицы или
               индекса  хранятся  в  меньшем  количестве  блоков (больше
               строк на один блок)
            *  увеличивает стоимость обработки, так как ORACLE  вынужден
               часто  реорганизовывать  блоки  по  мере  заполнения   их
               свободной памяти новыми или обновленными данными
            *  потенциально увеличивает стоимость обработки и  требуемую
               память,  если  обновления   строк  или  записей   индекса
               приводят к  росту строк  и расщеплению  их между  блоками
               (ибо предложения UPDATE, DELETE и SELECT должны считывать
               больше  блоков  для  данной  строки,  следуя  по цепочке,
               связывающей куски строки)
 
        Высокое значение PCTFREE имеет следующие эффекты:
 
            *  резервирует  больше  места  для  обновлений  существующих
               строк таблицы
 
            *  может потребовать  больше памяти  для того  же количества
               вставляемых данных (вставляет меньше строк на один блок)
 
            *  уменьшает  стоимость  обработки,  так  как  блоки   редко
               требуют реорганизации своей свободной памяти
 
            *  может улучшить производительность обновлений, потому  что
               ORACLE не должен столь часто, как прежде, строить цепочки
               для кусков строк
 
        При установке PCTFREE необходимо понимать природу данных таблицы
        или индекса.  Обновления могут  приводить к росту строк.   Новые
        значения могут иметь размер, отличный от размера заменяемых  ими
        значений.  Если имеют место много обновлений, при которых размер
        данных  увеличивается,  то   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
            *  уменьшает стоимость обработки,  требующейся при 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,  чтобы  требовалось  меньше  обработки   при
                        высокой   активности   обновлений,   т.е.    для
                        улучшения производительности.
 
 
Пример 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 уменьшает
                        число  блоков,  требуемое  для  размещения  всех
                        данных таблицы, сокращает среднее число  блоков,
                        просматриваемых во время  запросов, и тем  самым
                        увеличивает производительность запросов.
 
 
    Привилегии, требуемые для создания таблиц
 
        Чтобы  создать  новую  таблицу  в  вашей  схеме, вы должны иметь
        системную  привилегию  CREATE  TABLE.   Чтобы  создать таблицу в
        схеме другого пользователя, вы должны иметь системную привилегию
        CREATE ANY  TABLE.  Кроме  того, владелец  таблицы должен  иметь
        квоту для табличного пространства, в котором содержится таблица,
        либо системную привилегию  UNLIMITED TABLESPACE.
 
 
Изменение таблиц
----------------
 
        Существуют   следующие   причины,   которые   могут  потребовать
        изменения таблицы в базе данных ORACLE:
 
            *  чтобы добавить один или несколько новых столбцов
 
            *  чтобы добавить одно или несколько ограничений целостности
 
            *  чтобы  модифицировать  определение  существующего столбца
               (тип данных, длину, умалчиваемое значение или ограничение
               целостности NOT NULL)
 
            *  чтобы модифицировать параметры использования памяти блока
               данных таблицы (PCTFREE, PCTUSED)
 
            *  чтобы  модифицировать  характеристики  записей транзакций
               (INITRANS, MAXTRANS)
 
            *  чтобы модифицировать параметры памяти (NEXT,  PCTINCREASE
               и т.п.)
 
            *  чтобы включить или выключить ограничения целостности  или
               триггеры, ассоциированные с таблицей
 
            *  чтобы удалить ограничения целостности, ассоциированные  с
               таблицей
 
        При изменении  определений столбцов  в таблице,  вы можете  лишь
        увеличить длину  существующего столбца;  вы можете  уменьшить ее
        лишь в  том случае,  если таблица  пуста.  Более  того, если  вы
        увеличиваете  длину  столбца  с  типом  данных  CHAR,  вы должны
        понимать,  что  эта  операция  может  потребовать  значительного
        времени  и  существенной  дополнительной  памяти,  особенно если
        таблица содержит много строк.  Причина в том, что значение  CHAR
        в каждой строке должно  быть дополнено пробелами до  новой длины
        столбца.
 
        Чтобы  изменить  таблицу,  используйте  команду SQL ALTER TABLE.
        Например, следующее предложение изменяет таблицу EMP:
 
        ALTER TABLE emp
            PCTFREE 30
            PCTUSED 60;
 
        Вы должны понимать следующие последствия изменения таблицы:
 
            *  Если к таблице  добавляется новый столбец,  то изначально
               он пуст.  Вы можете добавить новый столбец с ограничением
               NOT NULL лишь в том  случае, если в таблице нет  ни одной
               строки.
 
            *  Если  обзор  или  программная  единица  PL/SQL зависят от
               базовой таблицы, то изменение этой базовой таблицы  может
               повлиять  на  зависимый  объект,  и  всегда  делает  этот
               зависимый объект недействительным.
 
 
    Привилегии, требуемые для изменения таблиц
 
        Чтобы  изменить  таблицу,  либо  она  должна содержаться в вашей
        схеме, либо вы должны иметь объектную привилегию ALTER для  этой
        таблицы, или системную привилегию ALTER ANY TABLE.
 
 
Удаление таблиц
---------------
 
        Чтобы  удалить  ненужную  таблицу,  используйте команду SQL DROP
        TABLE.  Например, следующее предложение удаляет таблицу EMP:
 
        DROP TABLE emp;
 
        Если удаляемая таблица  содержит первичный или  уникальный ключ,
        на который ссылаются внешние  ключи других таблиц, то  вы можете
        одновременно с этой таблицей удалить ограничения FOREIGN KEY для
        порожденных таблиц, включив в команду DROP TABLE опцию  CASCADE,
        например:
 
        DROP TABLE emp CASCADE CONSTRAINTS;
 
        Прежде  чем  удалять  таблицу,  примите  во  внимание  следующие
        эффекты этого действия:
 
            *  Удаление таблицы  приводит к  удалению ее  определения из
               словаря данных.  Все строки таблицы необратимо теряются.
            *  Все индексы и триггеры, ассоциированные с таблицей, также
               удаляются.
            *  Все  обзоры  и  программные  единицы PL/SQL, зависимые от
               удаляемой     таблицы,     остаются,     но    становятся
               недействительными   (непригодными   для   использования).
            *  Все синонимы  удаленной таблицы  остаются, но  возвращают
               ошибку при обращении к ним.
            *  Все экстенты, распределенные удаляемой некластеризованной
               таблице,  возвращаются  в  свободную  память   табличного
               пространства   и   могут   использоваться   любым  другим
               объектом, требующим новых экстентов.
            *  Все  строки,  соответствующие  удаляемой кластеризованной
               таблице, удаляются из блоков кластера.
 
        Если  вы  хотите  удалить  все  строки  таблицы,  но   сохранить
        определение  этой  таблицы,   вы  должны  использовать   команду
        TRUNCATE TABLE.  Эта команда описана в документе ORACLE7  Server
        Administrator's Guide.
 
 
    Привилегии, требуемые для удаления таблиц
 
        Чтобы  удалить  таблицу,  либо  она  должна  содержаться в вашей
        схеме, либо вы должны иметь системную привилегию DROP ANY TABLE.
 
 
Управление обзорами
 
        ОБЗОР  -  это  логическое  представление  таблицы или комбинации
        таблиц.   Обзор  выводит  свои  данные  из таблиц, на которых он
        базируется.  Эти таблицы  называются БАЗОВЫМИ ТАБЛИЦАМИ  данного
        обзора.   Базовые  таблицы,  в  свою  очередь,  могут  быть  как
        настоящими таблицами, так и другими обзорами.
 
        Все  операции,   выполняемые  по   обзору,  в   действительности
        затрагивают   базовую   таблицу   этого   обзора.    Вы   можете
        использовать обзоры почти теми же способами, что и таблицы.   Вы
        можете опрашивать обзоры, обновлять  их, вставлять и удалять  их
        строки,  точно  так  же,  как  вы  делаете  это  со стандартными
        таблицами.
 
        Обзоры   предоставляют    средство   различного    представления
        (например, подмножеств или надмножеств) данных, расположенных  в
        других  таблицах  и  обзорах.   Обзоры  - очень мощное средство,
        потому что они позволяют вам привязывать представление данных  к
        различным типам пользователей.
 
        Следующие секции  объясняют, как  создавать, заменять  и удалять
        обзоры, используя несколько команд 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  здесь  не  имеет смысла.  См.
        страницу 2-13.
 
    Расширение определяющего запроса во время создания обзора
 
        В соответствии  со стандартом  ANSI/ISO, ORACLE  расширяет любое
        групповое обозначение  на верхнем  уровне определяющего  запроса
        обзора  в  список  столбцов,   и  сохраняет  в  словаре   данных
        результирующий  обзор;  все  подзапросы  остаются без изменений.
        Имена  столбцов  в  расширенном  списке  столбцов  заключаются в
        кавычки, на  тот случай,  если имена  столбцов базового  объекта
        были   изначально   определены   в   кавычках,   и  для гарантии
        синтаксической корректности запроса.
 
        В  качестве  примера  предположим,  что  обзор  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 ...;
 
        Когда создается обзор  с ошибками, ORACLE  возвращает сообщение,
        указывающее, что обзор был создан с ошибками.  Такой обзор имеет
        состояние  INVALID  (недействительный).   Если  позднее  условия
        изменятся так, что недействительный обзор сможет быть  выполнен,
        этот обзор может  быть перекомпилирован и  станет действительным
        (VALID).
 
Привилегии, требуемые для создания обзоров
 
        Чтобы   создать   обзор,   вы   должны   удовлетворять следующим
        требованиям:
 
            *  Чтобы  создать  обзор  в  вашей  схеме,  вы  должны иметь
               привилегию  CREATE  VIEW;  чтобы  создать  обзор  в схеме
               другого   пользователя,   вы   должны   иметь   системную
               привилегию  CREATE  ANY  VIEW.   Обе эти привилегии могут
               быть получены вами явно или через роль.
 
            *  ВЛАДЕЛЕЦ обзора (т.е. владелец схемы, в которой создается
               обзор) должен обладать ЯВНО назначенными привилегиями для
               доступа  к  объектам,  на  которые  ссылается определение
               обзора; эти привилегии НЕ МОГУТ быть получены через роль.
               Кроме   того,   работоспособность   обзора   зависит   от
               привилегий  владельца   этого  обзора.    Например,  если
               владелец обзора имеет лишь привилегию INSERT для  таблицы
               SCOTT.EMP, то обзор  можно использовать лишь для  вставки
               новых строк  в таблицу  EMP, но  не для  запросов по этой
               таблице и не для обновления или удаления строк в ней.
 
            *  Если владелец обзора  намеревается предоставить доступ  к
               этому  обзору  другим  пользователям,  он должен обладать
               объектными  привилегиями  для  базовых  объектов обзора с
               опцией GRANT OPTION, или системными привилегиями с опцией
               ADMIN OPTION.  В противном случае владелец не может  дать
               доступ к обзору другим пользователям.
 
Замена обзоров
--------------
 
        Если вы хотите изменить определение обзора, то обзор должен быть
        заменен; нельзя изменить определение обзора командой ALTER.   Вы
        можете заменять обзоры следующими способами:
 
            *  Вы можете  удалить и  заново создать  обзор.  Когда обзор
               удаляется,  все   гранты  на   соответствующие  объектные
               привилегии отзываются от ролей и от пользователей.  После
               пересоздания обзора все привилегии должны быть  назначены
               заново.
 
            *  Вы  можете  переопределить  обзор  с  помощью предложения
               CREATE  VIEW  с  опцией  OR  REPLACE.  Эта опция заменяет
               текущее  определение  обзора  и  не  затрагивает  текущих
               полномочий.  Например, предположим, что вы создали  обзор
               SALES_STAFF,   показанный   в   предыдущем   примере (см.
               страницу 2-9), и назначили несколько объектных привилегий
               ролям и  другим пользователям.   Однако теперь  вы хотите
               переопределить  обзор  SALES_STAFF,  чтобы изменить номер
               отдела,  заданный  в  фразе  WHERE,  на  30.   Вы  можете
               заменить  текущую  версию  обзора  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;
 
        Прежде  чем  заменять  обзор,  примите  во  внимание   следующие
        эффекты:
 
            *  Замена  обзора  лишь  заменяет  его определение в словаре
               данных.  Никакие объекты, на которые ссылается обзор,  не
               затрагиваются.
 
            *  Если  ограничение  в   опции  CHECK  OPTION   ранее  было
               определено, но не включается в новое определение  обзора,
               то это ограничение удаляется.
 
            *  Все  обзоры  и  программные  единицы PL/SQL, зависимые от
               заменяемого    обзора,    становятся    недействительными
               (непригодными для использования).
 
 
Привилегии, требуемые для замены обзора
 
        Чтобы   заменить   обзор,   вы   должны   иметь  все привилегии,
        необходимые для удаления и создания обзора.
 
 
Использование обзоров
---------------------
 
        Обзоры можно опрашивать так же, как и таблицы.  Например,  чтобы
        опросить   обзор    DIVISION1_STAFF,   введите    действительное
        предложение SQL, обращающееся к этому обзору:
 
        SELECT * FROM division1_staff;
 
        ENAME           EMPNO JOB       DNAME
        ---------- ---------- --------- --------------
        CLARK            7782 MANAGER   ACCOUNTING
        KING             7839 PRESIDENT ACCOUNTING
        MILLER           7934 CLERK     ACCOUNTING
        ALLEN            7499 SALESMAN  SALES
        WARD             7521 SALESMAN  SALES
        JAMES            7900 CLERK     SALES
        TURNER           7844 SALESMAN  SALES
        MARTIN           7654 SALESMAN  SALES
        BLAKE            7698 MANAGER   SALES
 
        С некоторыми ограничениями, с помощью обзора можно  осуществлять
        вставки,  обновления  и   удаления  строк  в   базовой  таблице.
        Следующее  предложение  вставляет  новую  строку  в таблицу EMP,
        используя обзор SALES_STAFF:
 
        INSERT INTO sales_staff
            VALUES (7954, 'OSTER', 30);
 
        Для операций  DML по  обзорам существуют  следующие ограничения,
        которые применяются  в том  порядке, в  котором они  перечислены
        здесь:
 
        1. Если   обзор   определен   запросом,   содержащим    операцию
           соединения, операторы  SET или  DISTINCT, фразу  GROUP BY или
           групповую  функцию,  то  через  этот запрос нельзя вставлять,
           обновлять или удалять строки базовых таблиц обзора.
 
        2. Если обзор  определен с  фразой WITH  CHECK OPTION,  то через
           этот  запрос  нельзя  вставлять,  обновлять или удалять такие
           строки базовой таблицы обзора, которые не могут быть  выбраны
           через этот же обзор.
 
        3. Если в обзоре не  участвует столбец базовой таблицы,  который
           определен с ограничением NOT  NULL и не имеет  фразы DEFAULT,
           то  через  этот  запрос  нельзя  вставлять  строк  в  базовую
           таблицу.
 
        4. Если запрос был создан с использованием выражения, такого как
           DECODE(deptno,10,'SALES',...),  то  через  этот запрос нельзя
           вставлять или обновлять строки базовых таблиц обзора.
 
        Например,   незьзя   выдавать   предложения   DML   по    обзору
        DIVISION1_STAFF,  так   как  этот   обзор  определен   запросом,
        содержащим операцию  соединения.  Ограничение,  созданное фразой
        WITH CHECK OPTION в обзоре SALES_STAFF, позволяет вставлять  или
        обновлять в таблице  EMP через этот  обзор лишь строки,  имеющие
        номер отдела (DEPTNO) 10.  Альтернативно, предположим, что обзор
        SALES_STAFF определен с помощью следующего предложения (т.е.  из
        определения исключен столбец DEPTNO):
 
        CREATE VIEW sales_staff AS
            SELECT empno, ename
            FROM emp
            WHERE deptno = 10
            WITH CHECK OPTION CONSTRAINT sales_staff_cnst;
 
        При этом определении  обзора, вы можете  обновлять поля EMPNO  и
        ENAME в существующих  строках, но вы  не можете вставлять  через
        обзор SALES_STAFF новые  строки в таблицу  EMP, потому что  этот
        обзор не  позволяет вам  задавать поле  DEPTNO (точнее, изменять
        его значение).  Однако, если бы для поля DEPTNO было  определено
        умалчиваемое значение  10, то  вы могли  бы осуществлять вставки
        строк.
 
    Обращения к недействительным обзорам
 
        При  попытке  обращения   к  недействительному  обзору,   ORACLE
        возвращает пользователю следующее сообщение:
 
        ORA-04063: view 'view_name' has errors
                   (запрос 'имя_запроса' имеет ошибки)
 
        Это  сообщение  выдается  тогда,  когда  обзор  существует,   но
        непригоден   к   использованию   из-за   ошибок   в  его запросе
        (независимо от  того, имели  ли место  ошибки в  момент создания
        обзора, или обзор был  создан успешно, но стал  недействительным
        позже из-за изменения или удаления нижележащих объектов).
 
Привилегии, требуемые для использования обзоров
 
        Чтобы выдавать для обзора запрос или предложение INSERT,  UPDATE
        или  DELETE,  вы  должны   иметь  для  этого  обзора   объектную
        привилегию SELECT,  INSERT, UPDATE  или DELETE,  соответственно,
        полученную либо явно, либо через роль.
 
Удаление обзоров
----------------
 
        Удаляйте  обзор  с  помощью  команды  SQL  DROP VIEW.  Например,
        следующее предложение удаляет обзор с именем SALES_STAFF:
 
        DROP VIEW sales_staff;
 
Привилегии, требуемые для удаления обзора
 
        Вы  можете  удалять  любой  обзор,  содержащийся  в вашей схеме.
        Чтобы  удалить  обзор  в  схеме  другого пользователя, вы должны
        иметь системную привилегию DROP ANY VIEW.
 
 
----------------
 
Управление последовательностями
 
        Генератор последовательностей генерирует порядковые номера.  Это
        полезно для автоматической генерации уникальных первичных ключей
        для  ваших  данных,  а  также  для  координирования ключей между
        различными строками или таблицами.
 
        Без генератора последовательностей порядковые номера можно  было
        бы  создавать   лишь  программным   способом.   Новое   значение
        первичного  ключа  можно  было  бы  получать  выбором последнего
        программно вычисленного значения и наращиванием его.  Этот метод
        требует блокировки во  время выполнения транзакции  и заставляет
        одновременно   работающих   пользователей   ожидать   очередного
        значения   первичного   ключа;   такое   ожидание   известно как
        СЕРИАЛИЗАЦИЯ (буквально - "выстраивание в очередь").  Если у вас
        есть такие программные конструкты в ваших приложениях, вы должны
        заменить     их      обращениимя     к      последовательностям.
        Последовательности    устраняют    сериализацию    и    улучшают
        конкурентные способности вашего приложения.
 
        Следующие секции  объясняют, как  создавать, изменять  и удалять
        последовательности  с  помощью   команд  SQL.  Рекомендации   по
        настройке  ваших  последовательностей  приводятся,  начиная   со
        страницы 2-18.
 
 
Создание последовательностей
----------------------------
 
        Создавайте  последовательность  с  помощью  команды  SQL  CREATE
        SEQUENCE.      Например,      следующая     команда      создает
        последовательность,   используемую    для   генерации    номеров
        сотрудников для столбца EMPNO таблицы EMP:
 
        CREATE SEQUENCE emp_sequence
            INCREMENT BY 1
            START WITH 1
            NOMAXVALUE
            NOCYCLE
            CACHE 10;
 
        Заметьте, что  для управления  работой последовательности  могут
        быть  специфицированы  некоторые  параметры.   С  помощью   этих
        параметров  вы  можете  указать,  должна  ли  последовательность
        возрастать     или     убывать,     задать     начальную   точку
        последовательности, ее  минимальное и  максимальное значения,  а
        также  интервал  приращения.    Опция  NOCYCLE  указывает,   что
        последовательность не сможет генерировать больше значений, когда
        достигнет своего максимального или минимального значения.
 
        Опция CACHE команды CREATE SEQUENCE обеспечивает предварительную
        генерацию нескольких  номеров последовательности  и поддерживает
        их в памяти (кэширует), так что доступ к ним ускоряется.   Когда
        использован последний из номеров в кэше, ORACLE считывает в  кэш
        очередную группу номеров.
 
        Параллельный сервер  ORACLE создает  дополнительные эффекты  для
        кэшируемых  последовательностей;  для  дополнительной информации
        обратитесь к документу  ORACLE7 Parallel Server  Administrator's
        Guide.      Общая     информация     о     кэшировании   номеров
        последовательностей приведена на странице 2-18.
 
Привилегии, требуемые для создания последовательностей
 
        Чтобы создать последовательность в своей схеме, вы должны  иметь
        системную    привилегию    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.
 
 
Использование последовательностей
---------------------------------
 
        Следующие  секции  приводят  некоторые  рекомендации  о том, как
        использовать последовательность после того, как она  определена.
        Однажды  определенная,  последовательность  может  быть  сделана
        доступной многим пользователям, которые могут обращаться к  этой
        последовательности  и  вызывать  ее  приращения,  не  прибегая к
        ожиданию.   ORACLE  не  ждет  завершения транзакции, выполнившей
        приращение  последовательности,   для  того   чтобы  осуществить
        очередное приращение этой последовательности.
 
        Пример,   рассматриваемый   здесь   и   в   последующих секциях,
        показывает,  как  можно  применять  последовательность  в связях
        между главной и детальной таблицами.  Предположим, что в систему
        ввода заказов входят, в частности, две таблицы - ORDERS (главная
        таблица)  и   LINE_ITEMS  (детальная   таблица),  -   содержащие
        информацию о заказах покупателей.  Последовательность  ORDER_SEQ
        определена следующим предложением:
 
        CREATE SEQUENCE order_seq
            START WITH 1
            INCREMENT BY 1
            NOMAXVALUE
            NOCYCLE
            CACHE 20;
 
Обращение к последовательности
 
        Обращение к последовательности осуществляется в предложениях SQL
        через псевдостолбцы NEXTVAL и CURRVAL; каждый новый номер данной
        последовательности  генерируется  обращением  к ее псевдостолбцу
        NEXTVAL,  тогда  как  текущий  номер  последовательности   можно
        извлекать  неоднократно  путем  обращения  к  ее   псевдостолбцу
        CURRVAL.
 
        NEXTVAL и CURRVAL  не являются зарезервированными  или ключевыми
        словами;  их  можно  использовать  как  имена  псевдостолбцов  в
        предложениях SQL, таких как SELECT, INSERT или UPDATE.
 
    Генерация номеров последовательности через NEXTVAL
 
        Чтобы  сгенерировать   и  возвратить   очередной  номер   данной
        последовательности, обратитесь к seq_name.NEXTVAL, где  seq_name
        - имя последовательности.   Например, предположим, что  заказчик
        размещает заказ.  Номер последовательности можно специфицировать
        в списке вставляемых значений как номер нового заказа, например:
 
        INSERT INTO orders (orderno, custno)
            VALUES (order_seq.NEXTVAL, 1032);
 
        или в фразе SET предложения UPDATE, например:
 
        UPDATE orders
            SET orderno = order_seq.NEXTVAL
            WHERE orderno = 10112;
 
        или  в  самом  внешнем  списке  SELECT  запроса  или подзапроса,
        например:
 
        SELECT order_seq.NEXTVAL FROM dual;
 
        По определению, первое  обращение к ORDER_SEQ.NEXTVAL  возвратит
        значение  1.   Каждое  последующее  предложение,  обращающееся к
        ORDER_SEQ.NEXTVAL,    возвратит    очередной    номер     данной
        последовательтности  (2,  3,  4  и т.д.).  Псевдостолбец NEXTVAL
        может  генерировать  столько  новых  номеров последовательности,
        сколько потребуется.   Однако на  одно предложение  генерируется
        лишь один новый номер; иными словами, если в данном  предложении
        SQL псевдостолбец NEXTVAL встречается несколько раз, то лишь для
        первого     обращения     будет     возвращен     новый    номер
        последовательности, а все остальные обращения в этом предложении
        возвратят тот же  самый номер.  После  того как очередной  номер
        последовательности  сгенерирован,   этот  номер   доступен  лишь
        сессии, сгенерировавшей  его.  Независимо  от подтверждения  или
        отката    транзакций,    все    пользователи,    обращающиеся  к
        ORDER_SEQ.NEXTVAL, получают уникальные значения.  Поэтому,  если
        несколько пользователей одновременно обращаются к одной и той же
        последовательности,  каждый  из  них  может получать номера этой
        последовательности   с    промежутками,   потому    что   номера
        генерируются также другими пользователями.
 
    Использование номеров последовательности через CURRVAL
 
        Чтобы обратиться к текущему значению номера  последовательности,
        которое  уже  было  сгенерировано  для вашей сессии, используйте
        обозначение    seq_name.CURRVAL,    где    seq_name    -     имя
        последовательности.  Псевдостолбец CURRVAL может  использоваться
        лишь  в  том  случае,  если  в  текущей  сессии  уже было выдано
        обращение к seq_name.NEXTVAL  для данной последовательности  (не
        обязательно в текущей  транзакции).  CURRVAL можно  использовать
        сколько угодно раз, в том числе  несколько раз в одном и том  же
        предложении.   Очередной   номер  последовательности   не  будет
        сгенерирован,  пока  не  будет  выполнено  очередное обращение к
        NEXTVAL.   Продолжая  предыдущий  пример,  вы могли бы завершить
        размещение заказа, вставив в детальную таблицу строки  элементов
        заказа:
 
        INSERT INTO line_items (orderno, partno, quantity)
            VALUES (order_seq.CURRVAL, 20321, 3);
 
        INSERT INTO line_items (orderno, partno, quantity)
            VALUES (order_seq.CURRVAL, 29374, 1);
 
        Если предложение  INSERT в  предыдущей секции  сгенерировало для
        номера нового заказа, скажем, число 347, то оба эти  предложения
        вставят строки с тем же номером заказа 347.
 
    Применения и ограничения NEXTVAL и CURRVAL
 
        NEXTVAL и CURRVAL могут использоваться в следующих местах:
 
            *  в фразе VALUES предложения INSERT
            *  в списке SELECT предложения SELECT
            *  в фразе SET предложения UPDATE
 
        NEXTVAL и CURRVAL не могут использоваться в следующих местах:
 
            *  в подзапросе
            *  в запросе, определяющем обзор или снимок
            *  в предложении SELECT с оператором DISTINCT
            *  в предложении SELECT с фразой GROUP BY или ORDER BY
            *  в   предложении   SELECT,   скомбинированном   с   другим
               предложением SELECT одним  из операторов множеств  UNION,
               INTERSECT или MINUS
            *  в фразе WHERE предложения SELECT
            *  в  выражении  DEFAULT  для  столбца  в предложении CREATE
               TABLE или ALTER TABLE
            *  в условии ограничения CHECK
 
 
    Кэширование номеров последовательностей
 
        Номера   последовательностей   могут   поддерживаться   в   кэше
        последовательностей в глобальной области системы (SGA).   Номера
        последовательностей  извлекаются  из   кэша  быстрее,  чем   при
        считывании их с диска.
 
        Кэш последовательностей  состоит из  входов.  Каждый  вход может
        содержать много номеров для одной последовательности.
 
        Чтобы   организовать   эффективный   доступ   ко   всем  номерам
        последовательностей, соблюдайте следующие рекомендации:
 
            *  Обеспечьте,  чтобы  кэш  последовательностей  умещал  все
               последовательности,  которые  одновременно   используются
               вашим приложением.
 
            *  Увеличьте   для   каждой   последовательности  количество
               значений, поддерживаемых в кэше последовательностей.
 
    Число входов в кэше последовательностей
 
        Когда приложение обращается к последовательности, находящейся  в
        кэше  последовательностей,  оно  быстро  получает  номера   этой
        последовательности.   Однако,  когда  приложение  обращается   к
        последовательности,   которая   не   находится   в   кэше, такая
        последовательность должна быть считана с диска в кэш, прежде чем
        ее номера могут быть использованы.
 
        Если  ваше  приложение  использует  одновременно  много   разных
        последовательностей,  то  кэш  последовательностей  может   быть
        недостаточно велик, чтобы  вместить все эти  последовательности.
        В  этом  случае  обращения  к  номерам последовательностей может
        приводить к частым обращениям к диску.  Для быстрого доступа  ко
        всем  последовательностям  вы  должны  обеспечить, чтобы ваш кэш
        имел     достаточно     входов,     чтобы     поддерживать   все
        последовательности,  которые  одновременно  используются   вашим
        приложением.
 
        Число входов в кэше последовательностей определяется  параметром
        инициализации  SEQUENCE_CACHE_ENTRIES.   Умалчиваемое   значение
        этого   параметра   составляет   10   входов.    Помимо    ваших
        последовательностей,  ORACLE  внутренне  создает  и   использует
        последовательности  для  таких   целей,  как  аудитинг,   гранты
        системных  и  объектных  привилегий,  профили,  отладка хранимых
        процедур,  а  также  метки.   При  задании  числа  входов в кэше
        последовательностей  вы  должны  учитывать  эти   дополнительные
        последовательности.
 
        Если значение SEQUENCE_CACHE_ENTRIES слишком мало, ORACLE  может
        пропускать номера последовательностей, как в следующем сценарии:
        допустим, вы используете четыре кэшируемых последовательности, и
        SEQUENCE_CACHE_ENTRIES  =  4,   т.е.  кэш  заполнен.    Если  вы
        создадите  пятую  последовательность,  то  она  заменит наиболее
        давно   использовавшуюся   последовательность   в   кэше.    Все
        остававшиеся в кэше значения этой вытесненной последовательности
        будут потеряны.   Например, если  вытесняемая последовательность
        первоначально  имела  в  кэше  10  значений,  из  которых   было
        использовано  лишь  одно,  то  будут  потеряны  9  значений этой
        последовательности.
 
    Число значений в каждом входе кэша последовательностей
 
        Когда последовательность считывается в кэш  последовательностей,
        номера этой последовательности генерируются и помещаются во вход
        кэша.    Отсюда   эти   номера   могут   быть  быстро извлечены.
        Количество  значений  последовательности,  сохраняемых  в  кэше,
        определяется  параметром  CACHE  в  предложении CREATE SEQUENCE.
        Умалчиваемое значение этого параметра равно 20.
 
        Следующее предложение CREATE SEQUENCE создает последовательность
        SEQ2,   для   которого   в   кэше   последовательностей    будут
        поддерживаться 50 значений:
 
        CREATE SEQUENCE seq2
            CACHE 50
 
        После этого первые  50 значений SEQ2  будут выбираться из  кэша.
        При обращении к 51-му значению последовательности с диска в  кэш
        будут считаны очередные 50 значений.
 
        Выбор большого значения для CACHE позволит вам извлекать  больше
        последовательных  значений  последовательности  без  обращения к
        диску.    Однако   в   случае   сбоя   инстанции   все  значения
        последовательности,   содержащиеся   в   кэше,   будут потеряны.
        Кэшированные   номера   последовательности   могут   быть  также
        пропущены  или  дублированы  после  экспорта  и  импорта,   если
        транзакции  продолжают  обращаться  к номерам последовательности
        одновременно с выполнением экспорта.
 
        Если вы в предложении CREATE SEQUENCE используете опцию NOCACHE,
        то  значения  этой  последовательности  не  кэшируются.   В этом
        случае каждое  обращение к  последовательности требует  чтения с
        диска,  что  замедляет  доступ  к последовательности.  Следующее
        предложение  CREATE  SEQUENCE  создает  последовательность SEQ3,
        значения которого не поддерживаются в кэше последовательностей:
 
        CREATE SEQUENCE seq2
            NOCACHE
 
 
Привилегии, требуемые для использования последовательностей
 
        Чтобы использовать последовательность, вы должны либо владеть ею
        в  своей  схеме,  либо  иметь  объектную  привилегию  SELECT для
        последовательности, принадлежащей другому пользователю.
 
Удаление последовательностей
----------------------------
 
        Если последовательность больше не нужна, вы можете удалить ее  с
        помощью  команды   SQL  DROP   SEQUENCE.   Например,   следующее
        предложение удаляет последовательность ORDER_SEQ:
 
        DROP SEQUENCE order_seq;
 
        При  удалении  последовательности  ее  определение  удаляется из
        словаря данных.  Все  синонимы для последовательности  остаются,
        но возвращают ошибку при обращении к ним.
 
Привилегии, требуемые для удаления последовательностей
 
        Вы можете удалять любую последовательность, содержащуюся в вашей
        схеме.   Чтобы  удалить   последовательность  в  схеме   другого
        пользователя,  вы  должны  иметь  системную  привилегию DROP ANY
        SEQUENCE.
 
----------------
 
Управление синонимами
 
        Синоним   -   это    алиас   для   таблицы,    обзора,   снимка,
        последовательности,  процедуры,  функции  или пакета.  Следующие
        секции объясняют, как создавать, использовать и удалять синонимы
        с помощью команд 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 так  же, как  к
        нижележащему объекту этого  синонима.  Например, если  синоним с
        именем  EMP  ссылается  на  таблицу  или  обзор,  то   следующее
        предложение законно:
 
        INSERT INTO emp (empno, ename, job)
            VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');
 
        Если  синоним  с   именем  FIRE_EMP  ссылается   на  независимую
        процедуру   или   пакетированную   процедуру,   то   он    может
        использоваться в следующем контексте:
 
        EXECUTE fire_emp(7344);
 
Привилегии, требуемые для использования синонима
 
        Вы  можете   с  успехом   использовать  любой   личный  синоним,
        содержащийся в  вашей схеме,  а также  любой общий  синоним, при
        условии,  что  вы  имеете  необходимые  привилегии для доступа к
        нижележащему   объекту,   полученные   либо   явно,   либо через
        действующую роль,  либо через  группу PUBLIC.   Вы можете  также
        обращаться  к  любому  личному  синониму,  содержащемуся в чужой
        схеме, если вам были назначены необходимые объектные  привилегии
        для  этого  личного  синонима.   Вы  можете  использовать личный
        синоним  другого  пользователя   лишь  согласно  тем   объектным
        привилегиям, которые были вами  получены.  Например, если у  вас
        есть  привилегия  SELECT  для  синонима  JWARD.EMP, то вы можете
        выдавать запросы  по синониму  JWARD.EMP, но  не можете, скажем,
        вставлять строки через этот синоним.
 
Удаление синонимов
------------------
 
        Чтобы  удалить  ненужный  синоним,  используйте команду SQL DROP
        SYNONYM.  При удалении личного синонима опустите ключевое  слово
        PUBLIC;  при  удалении  общего  синонима  укажите ключевое слово
        PUBLIC.  Например, следующее предложение удаляет личный  синоним
        с именем EMP:
 
        DROP SYNONYM emp;
 
        Следующее предложение удаляет общий синоним с именем PUBLIC_EMP:
 
        DROP PUBLIC SYNONYM public_emp;
 
        Когда вы удаляете синоним, его определение удаляется из  словаря
        данных.   Все   объекты,  ссылающиеся   на  удаленный   синоним,
        остаются,  но  становятся  недействительными.
 
Привилегии, требуемые для удаления синонимов
 
        Вы можете  удалить любой  личный синоним,  содержащийся в  вашей
        схеме.    Чтобы   удалить   личный   синоним   в   схеме другого
        пользователя,  вы  должны  иметь  системную  привилегию DROP ANY
        SYNONYM.  Чтобы удалить общий синоним, вы должны иметь системную
        привилегию DROP PUBLIC SYNONYM.
 
Управление индексами
 
        Индексы  используются  в  ORACLE  для  того,  чтобы обеспечивать
        быстрый доступ  к строкам  таблицы.  Индексы  ускоряют доступ  к
        данным  для  операций,   затрагивающих  небольшую  часть   строк
        таблицы.
 
        ORACLE не  ограничивает количество  индексов, которые  вы можете
        создавать по таблице.  Однако вы должны рассматривать  возможные
        выгоды в производительности и потребности ваших приложений  базы
        данных, когда определяете, какие столбцы индексировать.
 
        Следующие секции  объясняют, как  создавать, изменять  и удалять
        индексы с помощью команд SQL, и предоставляют некоторые  простые
        рекомендации  по  работе  с  индексами.   Соображения о том, как
        влияет  создание  индексов  на  производительность, приводятся в
        секции "Как использовать индексы" на странице 5-2.
 
 
Создавайте индексы после загрузки данных в таблицу
 
        За  одним  заслуживающим   упоминания  исключением,  вы   должны
        создавать  индекс  по  таблице  после  того,  как  данные   были
        вставлены  или  загружены  в  таблицу  (с помощью SQL*Loader или
        импорта).  Гораздо эффективнее вставить строки данных в таблицу,
        не имеющую  индексов, а  затем создать  индексы для последующего
        доступа к этим данным.  Если вы создадите индексы перед тем, как
        загружать данные в таблицу, то при вставке каждой строки  данных
        требуется обновление всех индексов.  Исключение из этого правила
        касается кластера, для которого  вы ДОЛЖНЫ создать индекс  перед
        тем, как вставлять в кластер любые данные.
 
        Когда индекс  создается по  таблице, уже  имеющей данные, ORACLE
        должен использовать  область сортировки,  чтобы создать  индекс.
        ORACLE использует  область сортировки  в памяти,  распределяемой
        для  создателя  индекса  (размер  этой  области  на пользователя
        определяется   параметром   инициализации   SORT_AREA_SIZE),  но
        вынужден также обмениваться информацией сортировки с  временными
        сегментами, распределяемыми от имени процесса создания  индекса.
        Если  индекс  исключительно  велик,  может  оказаться   полезным
        выполнить следующие шаги:
 
        1. Создать новое табличное пространство для временных сегментов,
           используя команду CREATE TABLE.
        2. С  помощью  опции  TEMPORARY  TABLESPACE  команды  ALTER USER
           изменить табличное пространство  для временных сегментов  для
           создателя   индекса,   указав   вновь   созданное   табличное
           пространство.
        3. Создать индекс, используя команду CREATE INDEX.
        4. С   помощью   команды   DROP   TABLESPACE   удалить табличное
           пространство для временных  сегментов.  Затем командой  ALTER
           USER   снова   переопределить   табличное   пространство  для
           временных  сегментов  для  создателя  индекса,  указав старое
           табличное пространство.
 
        При  некоторых  условиях,  можно  загрузить  данные  в  таблицу,
        используя  режим  SQL*Loader  "загрузки  по прямому маршруту", и
        создать  индекс  по  мере  загрузки  данных;  для дополнительной
        информации  обратитесь  к  документу  ORACLE7  Server  Utilities
        User's Guide.
 
Индексируйте корректные таблицы и столбцы
 
        Используйте следующие рекомендации, принимая решение о  создании
        индекса:
 
            *  Создавайте  индекс,  если  вы  хотите  часто извлекать не
               более 1-15% строк в большой таблице.  Этот процент сильно
               варьируется  в  зависимости  от  относительной   скорости
               просмотра таблицы и от  разброса строк при каждом  данном
               значении индекса.  Чем быстрее просмотр таблицы, тем ниже
               этот  процент;   чем  больше   сгруппированы  строки   по
               значениям индексов, тем выше этот процент.
 
            *  Индексируйте столбцы,  используемые в  соединениях, чтобы
               улучшить производительность соединений нескольких таблиц.
 
               Замечание:  Первичные  и  уникальные  ключи автоматически
               имеют индексы,  но вы  можете захотеть  создать индекс по
               внешнему ключу; для дополнительной информации см.  секцию
               "Управление  одновременным  доступом,  индексы  и внешние
               ключи" на страницу 6-9.
 
            *  Маленькие таблицы  не требуют  индексов; если  ваш запрос
               идет слишком долго, возможно, таблица уже перестала  быть
               маленькой.
 
        Некоторые    столбцы    являются    сильными    кандидатами   на
        индексирование.  Таковы столбцы,  имеющие одну или  несколько из
        следующих характеристик:
 
            *  Значения столбца относительно уникальны.
 
            *  Существует широкий диапазон значений данного столбца.
 
            *  Столбец содержит много пустых значений, но запросы  часто
               выбирают все  столбцы, содержащие  непустые значения.   В
               таком случае, фраза:
 
               WHERE COL_X > -0.0000000000000000000099
 
               предпочтительнее, чем
 
               WHERE COL_X IS NOT NULL
 
               потому что в первом случае используется индекс по столбцу
               COL_X (в предположении, что COL_X - числовой столбец).
 
        Столбцы, обладающие следующими характеристиками, меньше подходят
        для индексирования:
 
            *  Столбец имеет мало различных значений (например,  столбец
               по полу сотрудников).
 
            *  Столбец  имеет  много  пустых  значений,  а  вы  не ищете
               непустые значения.
 
        Столбцы  LONG  и  LONG  RAW  не могут быть индексированы.
 
        Размер одной  записи индекса  не может  превышать приблизительно
        одной  трети  размера   блока  данных.   Проконсультируйтесь   с
        администратором базы данных, чтобы определить память,  потребную
        для создаваемого индекса.
 
 
Ограничивайте число индексов на таблицу
 
        Таблица может  иметь любое  число индексов.   Однако чем  больше
        индексов, тем больше накладные расходы при изменениях в таблице.
        Так,  при  вставке  и  удалении  строк должны быть обновлены все
        индексы по таблице.   Аналогично, при обновлении  столбца должны
        быть обновлены все индексы, содержащие этот столбец.
        Таким  образом,  следует   искать  компромисс  между   скоростью
        извлечения  данных  из  таблицы  и скоростью обновления таблицы.
        Например, если таблица большей  частью читается, то иметь  много
        индексов  может  быть  полезно,  однако, если таблица интенсивно
        обновляется, предпочтительнее иметь меньше индексов.
 
 
Упорядочивайте столбцы индекса для производительности
 
        Порядок,  в  котором  столбцы  инлекса  перечисляются  в команде
        CREATE INDEX, не обязан  соответствовать порядку, в котором  эти
        столбцы определены в таблице.  Однако порядок столбцов в команде
        CREATE  INDEX  существенен,  так   как  он  может  повлиять   на
        производительность запросов.  В общем случае, вы должны первым в
        индексе  указывать  тот  столбец,  который  будет использоваться
        наиболее часто.
 
        Например, предположим, что таблица VENDOR_PARTS имеет  следующие
        столбцы:
 
Рис.2-1
Таблица VENDOR_PARTS
 
        VEND_ID         PART_NO         UNIT_COST
        (поставщик)     (изделие)       (цена единицы)
        -------         -------         ---------
        1012            10-440                .25
        1012            10-441                .39
        1012               457               4.95
        1010            10-440                .27
        1010               457               5.10
        1220            08-300               1.33
        1012            08-300               1.19
        1292               457               5.28
 
        Предположим, что существуют пять поставщиков, и каждый поставщик
        выпускает около 1000 изделий.
 
        Допустим, таблица VENDOR_PARTS обычно опрашивается предложениями
        SQL, подобными следующему:
 
        SELECT * FROM vendor_parts
            WHERE part_no = 457 AND vendor_id = 1012;
 
        Чтобы увеличить производительность  таких запросов, вам  следует
        создать  составной  индекс,  указав  первым  самый   селективный
        столбец, т.е. столбец, имеющий БОЛЬШЕ различных значений:
 
        CREATE INDEX ind_vendor_id
            ON vendor_parts (part_no, vendor_id);
 
        Индексы  ускоряют  извлечение  для  любого  запроса,  в  котором
        участвует  ВЕДУЩАЯ  ЧАСТЬ  индекса.   Так,  в  приведенном  выше
        примере,  запросы,  в  которых  фраза  WHERE  использует  только
        столбец  PART_NO,  также  получат  выигрыш   производительности.
        Поскольку столбец VENDOR_ID имеет лишь пять различных  значений,
        создание отдельного индекса по этому столбцу не имеет смысла.
 
Создание индексов
-----------------
 
        Индекс   может   быть   создан   для   таблицы,   чтобы улучшить
        производительность  запросов,   выдаваемых  по   соответствующей
        таблице.   Индекс  может  также  быть  создан  для кластера.  Вы
        можете создать СОСТАВНОЙ индекс по нескольким (до 16) столбцам.
 
        ORACLE  вводит  в  действие  ограничение  целостности UNIQUE или
        PRIMARY  KEY,  автоматически   создавая  уникальный  индекс   по
        уникальному  или   первичному  ключу.    В  общем   случае,  для
        обеспечения уникальности предпочтительнее создавать ограничения,
        чем использовать устаревший синтаксис CREATE UNIQUE INDEX.
 
        Индексы создаются с помощью команды 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.
 
 
Удаление индексов
-----------------
 
        Вы можете захотеть удалить индекс по любой из следующих причин:
 
            *  Индекс    не    обеспечивает    ожидавшегося    улучшения
               производительности   для   запросов   по  ассоциированной
               таблице.  (Например, таблица слишком мала, или в  таблице
               много строк, но слишком мало записей индекса.)
 
            *  Приложения не используют этот индекс при опросах данных.
 
            *  Индекс стал недействительным  и должен быть  удален перед
               его  пересозданием.
 
        Когда вы удаляете индекс, все экстенты его сегмента возвращаются
        в содержащее табличное пространство и становятся доступными  для
        других объектов в этом табличном пространстве.
 
        Для  удаления  индекса  используйте  команду  SQL  DROP   INDEX.
        Например, следующее предложение удаляет индекс EMP_ENAME:
 
        DROP INDEX emp_ename;
 
        Когда вы удаляете таблицу, все ассоциированные индексы удаляются
        автоматически.
 
 
Привилегии, требуемые для удаления индекса
 
        Чтобы удалить индекс,  вы должны либо  иметь его в  своей схеме,
        либо обладать системной привилегией DROP ANY INDEX.
 
 
----------------
 
Управление кластерами, кластеризованными таблицами и индексами кластеров
 
        Так  как  кластеры  хранят  взаимосвязанные строки разных таблиц
        вместе  в  одних  и   тех  же  блоках  данных,   при  правильном
        использовании кластеров достигаются два основных преимущества:
 
            *  Сокращается  дисковый   ввод-вывод  и   улучшается  время
               доступа для соединений кластеризованных таблиц.
 
            *  Значение  ключа  кластера  (т.е.  значение,   связывающее
               таблицы в кластере) хранится лишь один раз, независимо от
               того,  сколько  строк   различных  таблиц  содержат   это
               значение.  Поэтому для данных связанных таблиц в кластере
               расходуется  меньше  памяти,  чем  для  таких же таблиц в
               некластеризованном формате.
 
 
Указания по созданию кластеров
------------------------------
 
        Следующие  секции  приводят  некоторые  рекомендации по созданию
        кластеров.    Относительно   характеристик    производительности
        обратитесь к секции "Как использовать кластеры" на странице 5-8.
 
Выбирайте подходящие таблицы для кластера
 
        Используйте кластеры для  хранения одной или  нескольких таблиц,
        которые главным образом опрашиваются (не так часто  изменяются),
        и  для  которых  запросы  часто  выполняют  соединение данных из
        нескольких связанных таблиц, либо извлекают связанные данные  из
        одной таблицы.
 
Выбирайте подходящие столбцы для ключа кластера
 
        Тщательно  выбирайте  столбцы   для  ключа  кластера.    Если  в
        запросах, выполняющих соединение таблиц, используются  несколько
        общих  столбцов,  сделайте  ключ  кластера  составным ключом.  В
        общем,  характеристики,  которые   указывают  на  хороший   ключ
        кластера,  те  же,  что   и  для  любого  индекса;   см.  секцию
        "Индексируйте корректные таблицы и столбцы" на странице 2-22.
 
        Хороший ключ кластера имеет достаточно уникальных значений,  так
        что  группа  строк,  соответствующих  каждому  значению   ключа,
        заполняет приблизительно один блок данных.  Слишком малое  число
        строк на  значение ключа  кластера приводит  к расходу  памяти и
        мало  дает  для  улучшения  производительности.   Ключи кластера
        столь специфичны,  что слишком  малое количество  строк, имеющих
        одинаковое значение ключа,  дает большой процент  неиспользуемой
        памяти  в  блоках,  если  только  при  создании кластера не было
        специфицировано маленькое значение SIZE.
 
        Слишком большое  число строк  на значение  ключа кластера  может
        привести к  лишним просмотрам  при отыскании  строк для  данного
        ключа.   Ключи  кластера,  созданные  по слишком общим атрибутам
        (таким, как пол: МУЖ или  ЖЕН), приводят к избыточным поискам  и
        могут дать ухудшение производительности вместо улучшения.
 
        Индекс кластера не  может быть уникальным,  и не может  включать
        столбец, определенный с типом данных LONG.
 
 
Соображения производительности
------------------------------
 
        Необходимо    заметить,    что    кластеры    могут     ухудшить
        производительность предложений DML (INSERT, UPDATE и DELETE)  по
        сравнению с хранением таблицы вне кластера со своим  собственным
        индексом.   Это  объясняется  способом  использования  памяти, а
        также  количеством  блоков,  которые  должны  быть  посещены при
        просмотре   таблицы;   поскольку   в   каждом   блоке   кластера
        сосредоточены данные нескольких таблиц, каждая отдельная таблица
        в кластере занимает больше блоков, чем если бы она хранилась вне
        кластера.   Вы  должны   принимать  ваши  решения   относительно
        кластеров, имея в виду эти компромиссы.
 
        Чтобы идентифицировать данные, которые  лучше было бы хранить  в
        кластеризованной  форме,   чем  в   некластеризованной,  поищите
        таблицы,  связанные  друг  с  другом через ограничения ссылочной
        целостности,  а  также   таблицы,  которые  часто   опрашиваются
        совместно, с помощью  предложений SELECT, соединяющих  данные из
        двух  или  более  таблиц.   Путем  кластеризации таких таблиц по
        столбцам, используемым для соединения данных, вы уменьшите число
        блоков  данных,  которое  должно  быть обработано для выполнения
        запросов;  все  строки,  необходимые  для  соединения по данному
        значению  ключа  кластера,  находятся  в  одном  и том же блоке.
        Поэтому производительность  запросов для  соединений улучшается.
        Аналогично, может оказаться полезным кластеризовать единственную
        таблицу.  Например, таблицу EMP можно было бы кластеризовать  по
        столбцу  DEPTNO,  чтобы   сгруппировать  вместе  все   строки  с
        одинаковыми значениями номера отдела.  Это оказалось бы выгодным
        для тех приложений, которые обрабатывают таблицу EMP по отделам.
 
        Как и индексы, кластеры не влияют на проектирование  приложений.
        Существование кластера прозрачно для пользователей и приложений.
        Данные, хранящиеся в кластере,  обрабатываются с помощью тех  же
        предложений SQL, что  и данные, хранящиеся  в некластеризованных
        таблицах.
 
 
Создание кластеров, кластеризованных таблиц и индексов кластеров
----------------------------------------------------------------
 
        Кластер используется для  хранения одной или  нескольких таблиц,
        которые  часто  соединяются  вместе  в  запросах.   Не   следует
        кластеризовать  таблицы,  которые,  как  правило, обрабатываются
        индивидуально.
 
        После того, как кластер  создан, в нем можно  создавать таблицы.
        Однако  прежде  чем  в  кластеризованные  таблицы  можно   будет
        вставлять   строки,   вы   должны   создать   индекс   кластера.
        Использование  кластеров  не  влияет  на создание дополнительных
        индексов  для  кластеризованных  таблиц;  такие  индексы   можно
        создавать и удалять как обычно.
 
        Для создания  кластера используйте  команду SQL  CREATE CLUSTER.
        Например,  следующее  предложение   создает  кластер  с   именеи
        EMP_DEPT,   который   будет   содержать   таблицы   EMP  и DEPT,
        кластеризуемые по (общему) столбцу DEPTNO:
 
        CREATE CLUSTER emp_dept (deptno NUMBER(3))
            PCTUSED 80
            PCTFREE 5;
 
        Для создания таблицы в  кластере используйте команду 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
            PCTFREE 5;
 
        Замечание: Ключ кластера не может быть уникальным.  Более  того,
        ORACLE  не  гарантирует  уникальности  отдельных  столбцов ключа
        кластера, даже  если они  определены с  ограничениями UNIQUE или
        PRIMARY KEY.
 
        Ключ  кластера   устанавливает  отношение   между  таблицами   в
        кластере.
 
 
Привилегии, требуемые для создания кластера,
кластеризованной таблицы и индекса кластера
 
        Чтобы создать кластер в  своей схеме, вы должны  иметь системную
        привилегию  CREATE  CLUSTER,   а  также  квоту   для  табличного
        пространства,  в   котором  будет   содержаться  кластер,   либо
        системную  привилегию   UNLIMITED  TABLESPACE.    Чтобы  создать
        кластер в схеме другого пользователя, вы должны иметь  системную
        привилегию CREATE ANY CLUSTER, а владелец должен иметь квоту для
        табличного пространства,  в котором  будет содержаться  кластер,
        либо системную привилегию UNLIMITED TABLESPACE.
 
        Чтобы  создать  таблицу  в  кластере,  вы должны иметь системную
        привилегию CREATE TABLE или CREATE ANY TABLE.  Вам не  требуется
        иметь  квоту  табличного  пространства  или системную привилегию
        UNLIMITED TABLESPACE для создания кластеризованной таблицы.
 
        Чтобы создать индекс кластера, ваша схема должна содержать  этот
        кластер, и вы должны иметь следующие привилегии:
 
            *  Системную  привилегию  CREATE  ANY  INDEX,  или,  если вы
               владеете кластером, привилегию CREATE INDEX.
 
            *  Квоту  для  табличного  пространства,  в  котором   будет
               содержаться  индекс  кластера,  либо системную привилегию
               UNLIMITED TABLESPACE.
 
 
Распределение памяти для кластера вручную
-----------------------------------------
 
        ORACLE  динамически  распределяет  дополнительные  экстенты  для
        сегмента данных  кластера при  необходимости.  Однако  вы можете
        захотеть явно распределить для кластера дополнительный  экстент.
        Например, в среде параллельного сервера ORACLE экстент  кластера
        может быть явно распределен для конкретной инстанции.
 
        Новый экстент можно распределить для кластера с помощью  команды
        SQL ALTER CLUSTER с опцией ALLOCATE EXTENT.  Для  дополнительной
        информации об этом параметре команды ALTER CLUSTER обратитесь  к
        документу ORACLE7 Parallel Server Administrator's Guide.
 
 
Удаление кластеров, кластеризованных таблиц и индексов кластеров
----------------------------------------------------------------
 
        Кластер может  быть удален,  если таблицы  в кластере  больше не
        нужны.  При удалении кластера удаляются все таблицы в кластере и
        соответствующий  индекс  кластера;  все экстенты, принадлежавшие
        как   сегменту   данных,   так   и   сегменту  индекса кластера,
        возвращаются в  содержащее табличное  пространство и  становятся
        доступными для других объектов в этом табличном пространстве.
 
        Кластеризованные  таблицы  можно  удалять  индивидуально, что не
        затрагивает кластер, другие кластеризованные таблицы или  индекс
        кластера.   Кластеризованная  таблица  удаляется  так  же, как и
        некластеризованная   таблица   -   командой   SQL   DROP  TABLE.
        Обратитесь  к  секции  "Удаление  таблиц"  на  странице  2-8 для
        информации об удалении индивидуальных таблиц.
 
        Замечание:  Когда  вы  удаляете  из  кластера одиночную таблицу,
        ORACLE удаляет каждую  строку этой таблицы  индивидуально.  Если
        вы  намереваетесь   удалить  весь   кластер,  для   максимизации
        эффективности  используйте   команду  DROP   CLUSTER  с   опцией
        INCLUDING TABLES.  Удаляйте  из кластера индивидуальную  таблицу
        (с помощью команды DROP TABLE) лишь в том случае, если вы хотите
        оставить остальную часть кластера.
 
        Можно удалить индекс кластера,  не затрагивая сам кластер  и его
        таблицы.     Однако,    кластеризованные    таблицы    не  могут
        использоваться, пока  не существует  индекс кластера;  вы должны
        пересоздать индекс  кластера, чтобы  открыть доступ  к кластеру.
        Индексы кластера иногда  приходится удалять как  часть процедуры
        пересоздания фрагментированного индекса кластера.  См. "Удаление
        индексов"  на  странице  2-25  для  дополнительной информации об
        удалении индексов.
 
        Чтобы  удалить  кластер,  не  содержащий  таблиц,  вместе  с его
        индексом,  используйте  команду  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 и существуют зависимые ограничения.
 
Привилегии, требуемые для удаления кластера
 
        Чтобы удалить кластер, вы должны  иметь его в своей схеме,  либо
        владеть системной привилегией DROP  ANY CLUSTER.  Вы не  обязаны
        иметь   дополнительных   привилегий   для   удаления   кластера,
        содержащего  таблицы,  даже  если  кластеризованные  таблицы  не
        принадлежат владельцу этого кластера.
 
----------------
 
Управление хэш-кластерами и их таблицами
 
        Следующие секции  объясняют, как  создавать, изменять  и удалять
        хэшированные  кластеры  и  кластеризованные  таблицы  с  помощью
        команд SQL.
 
Создание хэш-кластеров и кластеризованных таблиц
------------------------------------------------
 
        Хэш-кластер используется для хранения индивидуальных таблиц  или
        групп  кластеризованных   таблиц,  которые   статичны  и   часто
        опрашиваются запросами  на условия  равенства.  После  того, как
        создан хэш-кластер, в нем можно создавать таблицы.
        Хэш-кластер  создается  с  помощью  команды  SQL CREATE CLUSTER.
        Например,  следующее  предложение   создает  кластер  с   именем
        TRIAL_CLUSTER, который используется для хранения таблицы  TRIAL,
        кластеризуемой по столбцу TRIALNO:
 
        CREATE CLUSTER trial_cluster (trialno NUMBER(5,0))
            PCTUSED 80
            PCTFREE 5
            SIZE 2K
            HASH IS trialno HASHKEYS 150;
 
        CREATE TABLE trial (
            trialno NUMBER(5,0) PRIMARY KEY,
            ...)
            CLUSTER trial_cluster (trialno);
 
 
Управление использованием памяти в хэш-кластере
 
        При создании хэш-кластера важно корректно выбрать ключ  кластера
        и  установить  параметры  HASH  IS,  SIZE  и HASHKEYS так, чтобы
        оптимизировать   производительность   и   использование  памяти.
        Следующие  секции  предоставляют   рекомендации  и  примеры   по
        установке этих параметров.
 
        ВЫБОР КЛЮЧА.  Выбор корректного  ключа кластера зависит от  типа
        запросов,  которые  наиболее  часто  выдаются  по кластеризуемым
        таблицам.   Например,  рассмотрим  таблицу  EMP  в хэш-кластере.
        Если  запросы  часто  выбирают  строки  по номеру сотрудника, то
        ключом  кластера  следует  сделать  столбец  EMPNO; если запросы
        часто  выбирают  строки  по  номеру  отдела,  то ключом кластера
        должен  быть  столбец  DEPTNO.   Для  хэш-кластеров,  содержащих
        единственную таблицу, за ключ кластера обычно принимается полный
        первичный  ключ  этой  таблицы.   Хэш-кластер с составным ключом
        должен использовать внутреннюю хэш-функцию ORACLE.
 
        УСТАНОВКА HASH  IS. Специфицируйте  HASH IS  только тогда, когда
        ключ кластера является одиночным столбцом с типом данных NUMBER,
        и содержит равномерно  распределенные целые значения.   Если эти
        условия соблюдены, вы можете распределить строки в кластере так,
        что  каждое  уникальное  значение  ключа  кластера  хэшируется в
        уникальное  хэш-значение  (без  коллизий).   Если эти условия не
        соблюдены, опустите  эту опцию,  так что  вы будете использовать
        внутреннюю хэш-функцию ORACLE.
 
 
Удаление хэш-кластеров
----------------------
 
        Для удаления хэш-кластера используйте команду SQL DROP CLUSTER:
 
        DROP CLUSTER emp_dept;
 
        Чтобы удалить  таблицу в  хэш-кластере, используйте  команду SQL
        DROP TABLE.  Соображения по вопросам удаления хэш-кластера и его
        таблиц  такие  же,  как  и  для  индексированного кластера.  См.
        "Удаление   кластеров,   кластеризованных   таблиц   и  индексов
        кластеров" на странице 2-29.
 
Когда применять хэширование
---------------------------
 
        Хранение таблицы в хэш-кластере является альтернативой  хранению
        той же таблицы вне  кластера с индексом.  Хэширование  полезно в
        следующих ситуациях:
 
            *  Большинство запросов содержат условия равенства по  ключю
               кластера.  Например:
 
               SELECT . . . WHERE ключ_кластера = . . . ;
 
               В  таких  ситуациях,  ключ  кластера  можно хэшировать, и
               соответствующий  хэш-ключ  обычно  отыскивается  за  одну
               операцию   чтения.    Сравните   это   с  индексированной
               таблицей,  когда  значение  ключа  сначала  должно   быть
               найдено  в  индексе  (обычно  несколько  чтений), а затем
               строка считывается из таблицы (еще одно чтение).
 
            *  Таблицы в хэш-кластере  довольно статичны в  размере, так
               что  вы  можете  определить  число  строк и объем памяти,
               требуемый  для  таблиц  в  кластере.   Если  таблицам   в
               хэш-кластере   потребуется   дополнительное  пространство
               после  начального  распределения  для  кластера,  падение
               производительности может оказаться значительным, так  как
               потребуются блоки переполнения.
 
            *  Хэш-кластер с параметрами HASH IS col, HASHKEYS n и  SIZE
               m является идеальным представлением для массива (таблицы)
               из n элементов (строк),  где каждый элемент состоит  из m
               байт данных.  Например, массив
 
               ARRAY X[100] OF NUMBER(8)
 
               можно воплотить следующим образом:
 
               CREATE CLUSTER c(subscript INTEGER)
                   HASH IS subscript HASHKEYS 100 SIZE 10;
               CREATE TABLE x(subscript NUMBER(2)), value NUMBER(8))
                   CLUSTER c(subscript);
 
        И  наоборот,  хэширование  не  дает  преимущества  в   следующих
        сиуациях:
 
            *  Большинство  запросов   извлекают  строки   по  интервалу
               значений  ключа  кластера.   Например,  полные  просмотры
               таблиц, или запросы вида:
 
               SELECT ... WHERE ключ_класт