Поддерживается ли невидимый индекс операциями DML? - PullRequest
0 голосов
/ 04 ноября 2019

Поэтому я решил смоделировать и посмотреть, что произошло (я учу оракула около 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, я нашел этот подход и думаю, что это поможет большему числу новичков.

1 Ответ

0 голосов
/ 05 ноября 2019

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

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

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

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

...