首页 > 解决方案 > DML 操作是否维护一个不可见的索引?

问题描述

所以我决定模拟并看看发生了什么(我正在学习 oracle 大约 7 个月,可能会出错),我知道在正常索引中维护 DML 操作(当 DML 操作导致索引更新时),但我想检查invisible indexesDML 操作维护与否。现在我创建表 =>

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

所以它又被改变了,我不知道我是否正确,但我想知道专家的意见,因为在谷歌中搜索了更多关于这个但我找不到明确的答案,我模拟了这个看看在 DML 操作中发生了什么,我发现这种方法,我认为这将有助于更多的初学者。

标签: oracleindexinginvisibledml

解决方案


很容易混淆索引的两个重要属性:

1) 能见度。正如您所看到的,这不会影响 DML 导致的索引的底层维护,它只是控制该索引是否有资格用于优化器,当它正在制定运行查询的最佳方式时。“可见性”与查看它的优化器有关。例如,如果您使索引不可见,但该索引被定义为 UNIQUE,那么请放心,如果您尝试插入重复项,则该不可见索引仍然会引发错误。

2)可用性。索引也可以设置为“不可用”。这是数据库在 DML 发生时不再更新索引中的条目的地方。因此,不能简单地使用索引,因为它不再代表索引的真实状态。我们使索引通常无法使用,以便在表上更有效地执行大型操作。在大型操作结束时,我们需要对该索引发出 REBUILD 以使其重新与(更改的)表数据对齐,因此它再次变得可用。

希望有帮助。


推荐阅读