Авг 082012
 

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

Такие индексы создаются с ключевым словом NOSEGMENT:

CREATE INDEX tab_name_vi ON tab(column_name) NOSEGMENT;

Этот индекс будет проигнорирован оптимизатором, если не установить параметр _use_nosegment_indexes:

ALTER SESSION SET "_use_nosegment_indexes" = TRUE;

Теперь в этой конкретной сессии планы запросов будут строиться с учётом этого виртуального индекса. На другие сессии и на планы запросов, уже находящиеся в shared pool, никакого влияния не будет.

Виртуальные индексы не видны в представлении DBA_INDEXES, они есть только в DBA_OBJECTS. Отдельного представления для них нет, но выделить из массы объектов их не сложно:

SELECT 
	DO.owner, 
	DO.object_name fake_index_name
FROM dba_objects DO
WHERE DO.object_type='INDEX'
 
MINUS
 
SELECT 
	di.owner, 
	di.index_name
FROM dba_indexes di;

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)