Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РСБДтЗ / Курс лекций РСБДиЗ.doc
Скачиваний:
135
Добавлен:
05.03.2016
Размер:
1.63 Mб
Скачать

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

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

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

drop table ih;

create table ih(p number constraint ipk primary key, s varchar2(100) null, n number null, nu number null constraint iun unique)

organization index;

select constraint_name, constraint_type, table_name, index_name from user_constraints where table_name = 'IH';

select index_name, index_type, table_name, status, funcidx_status from user_indexes where table_name = 'IH';

insert into ih(p, s, n, nu) select object_id, object_name, object_id, object_id from all_objects;

analyze table ih compute statistics for table for all indexes for all indexed columns;

commit;

select * from ih where s = 'h';

select s from ih where p = 123;

create index iind_s on ih(s);

analyze table ih compute statistics for table for all indexes for all indexed columns;

select * from ih where s = 'h';

-- фактически это не сегмент таблицы а сегмент индекса

select * from user_segments where segment_name in ('H', 'IH', 'PK', 'IPK');

-- отсутствие full table scan - вместо этого fast full scan

select * from ih;

-- отсутствие rowid в индексных таблицах

select rowid from ih where rownum < 10;

Листинг 12.5. (html, txt)

Принципы построения запросов для эффективного использования индексов

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

Соседние файлы в папке РСБДтЗ