Поддерживается ли невидимый индекс операциями DML?

Поэтому я решил смоделировать и посмотреть, что произошло (я изучаю оракул около 7 месяцев, могут быть ошибки), я знаю, что в обычных индексах операции DML сохраняются (индексы обновляются, когда вызываются операции DML), но я хочу проверить invisible indexes в DML операции, которые поддерживаются или нет. Теперь я создаю таблицу =>

create table emin1 ( id number primary key, nomre number );

insert into emin1 values(1,1);
insert into emin1 values(2,1);

Сначала, чтобы получить имя индекса (я не создавал индекс), затем я использовал анализ в normal index =>

SQL> select index_name,table_name  from user_indexes a where table_name = 'EMIN3';

INDEX_NAME      TABLE_NAME
--------------- ---------------
SYS_C008422     EMIN3

analyze index SYS_C008422 validate structure;

SQL> select name, lf_rows,distinct_keys from index_stats;

NAME               LF_ROWS DISTINCT_KEYS
--------------- ---------- -------------
SYS_C008422              2             2

Я не знаю большинство столбцов в index_stats и выбираю столбец DISTINCT_KEYS(знаю только это :)) ), после статики снова вставляю 2 строку и снова анализирую =>

insert into emin1 values(3,1);
insert into emin1 values(4,1);

analyze index SYS_C008422 validate structure;

SQL>  select name, lf_rows,distinct_keys from index_stats;

NAME               LF_ROWS DISTINCT_KEYS
--------------- ---------- -------------
SYS_C008422              4             4

Итак, после операции вставки мы увидели, что это изменилось в index_stats (это означает, что оно сохраняется), и после normal index я применил это к invisible index =>

SQL> alter index SYS_C008422 invisible;

Index altered.

Вставляет несколько строк=>

insert into emin1 values(5,1);
insert into emin1 values(6,1);
insert into emin1 values(7,1);

SQL> analyze index SYS_C008422 validate structure;

Index analyzed.

SQL> select name, lf_rows,distinct_keys from index_stats;

NAME               LF_ROWS DISTINCT_KEYS
--------------- ---------- -------------
SYS_C008422              7             7

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


person Community    schedule 04.11.2019    source источник
comment
Цитата из руководства Поддерживается невидимый индекс операциями DML, но не используется оптимизатором во время запросов   -  person a_horse_with_no_name    schedule 04.11.2019
comment
Спасибо @a_horse_with_no_name   -  person    schedule 05.11.2019


Ответы (1)


Легко спутать два важных атрибута индекса:

1) Видимость. Как вы видели, это не влияет на базовое обслуживание индекса из-за DML, оно просто контролирует, подходит ли этот индекс для использования оптимизатором, когда он разрабатывает лучший способ выполнения запроса. «Видимость» относится к оптимизатору, который смотрит на него. Например, если вы делаете индекс невидимым, но этот индекс определен как УНИКАЛЬНЫЙ, будьте уверены, что если вы попытаетесь вставить дубликаты, этот невидимый индекс все равно вызовет ошибку.

2) Удобство использования. Индекс также может быть установлен как «непригодный». Здесь база данных больше не будет обновлять записи в индексе, когда происходит DML. Таким образом, индекс нельзя использовать просто потому, что он больше не представляет истинное состояние индекса. Обычно мы делаем индексы непригодными для более эффективного выполнения больших операций над таблицей. По завершении большой операции нам нужно выполнить REBUILD для этого индекса, чтобы вернуть его в соответствие с (измененными) данными таблицы, и, следовательно, он снова станет пригодным для использования.

Надеюсь, это поможет.

person Connor McDonald    schedule 05.11.2019
comment
Спасибо, мистер @Connor McDonald, за помощь, и я узнал новое о непригодных для использования индексах. - person ; 05.11.2019