В Oracle? и Oracle6 информация, хранящаяся в индексе (при условии, что блоки-листья не сжаты), содержится и в блоках данных. Во многих случаях существуют три экземпляра каждой записи — в таблице, индексе по столбцам (language_code, emp#) и в индексе по столбцам (emp#, language_code).
Если мы сделаем уровень знания языка отдельной сущностью с атрибутом skill_code, то сможем представить таблицу languages_spoken как трехстороннее пересечение и построить для нее еще больше индексов. Поскольку любой использующий эти индексы запрос может полностью разрешаться (и разрешается) без обращения к таблице, хранение самой таблицы кажется бесполезной тратой места.
В OracleS такие проблемы позволяет решить объект нового типа — индекс-таблица. Многие, наверное, посчитают его просто индексом без таблицы. С синтаксической точки зрения, данный объект обрабатывается, как таблица, поэтому мы просто не будем мешать Oracle поступать по-своему и называть его индекс-таблицей. Многие разработчики и администраторы баз данных весьма заинтригованы этой возможностью, но советуем отнестись к ней с осторожностью, так как существует целый ряд ограничений, которые следует учесть до того, как использовать индекс-таблицы с целью экономии места (а также сокращения времени резервного копирования и восстановления).
Первое разочарование наступит, когда мы изучим следующую традиционную структуру:
CREATE TABLE part__usage
( used_by_part# NUMBER(8,0) NOT NULL
, used_in_part# NUMBER(8,0) NOT NULL
, quantity_used NUMBER(8,0) NOT NULL
, PRIMARY KEY (used_by_part#, used_in_partt)
i ;
Когда мы вставляем в эту таблицу строку, около 75% процессорного времени затрачивается на корректировку индекса. Поэтому отсутствие таблицы как таковой сэкономит нам около 25% времени при вставке каждой строки, одно обращение к блоку при запросе (что, вероятно, составит еще 25% экономии процессорного времени) и немного места на диске. Возможно, такая экономия полезна, но настолько ли?
Ситуация ухудшается, если нам нужно загрузить в таблицу большое количество записей. В традиционной таблице мы отключаем ограничение первичного ключа, используем прямую загрузку данных, а затем вновь включаем ограничение. Такая загрузка происходит намного быстрее, чем загрузка с включенным индексом (при этом следует помнить, что в индекс-таблицах не поддерживается ни опция прямой загрузки утилиты SQL*Loader, ни операция INSERT APPEND). Чтобы создать индексный эквивалент таблицы part_usage, нам достаточно указать следующее:
CREATE TABLE part_usage
( used_by_part# NUMBER(8,0) NOT NULL
4.  "Большие" особенности OracleS	67