oracle - DML 操作是否维护一个不可见的索引?
问题描述
所以我决定模拟并看看发生了什么(我正在学习 oracle 大约 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
所以它又被改变了,我不知道我是否正确,但我想知道专家的意见,因为在谷歌中搜索了更多关于这个但我找不到明确的答案,我模拟了这个看看在 DML 操作中发生了什么,我发现这种方法,我认为这将有助于更多的初学者。
解决方案
很容易混淆索引的两个重要属性:
1) 能见度。正如您所看到的,这不会影响 DML 导致的索引的底层维护,它只是控制该索引是否有资格用于优化器,当它正在制定运行查询的最佳方式时。“可见性”与查看它的优化器有关。例如,如果您使索引不可见,但该索引被定义为 UNIQUE,那么请放心,如果您尝试插入重复项,则该不可见索引仍然会引发错误。
2)可用性。索引也可以设置为“不可用”。这是数据库在 DML 发生时不再更新索引中的条目的地方。因此,不能简单地使用索引,因为它不再代表索引的真实状态。我们使索引通常无法使用,以便在表上更有效地执行大型操作。在大型操作结束时,我们需要对该索引发出 REBUILD 以使其重新与(更改的)表数据对齐,因此它再次变得可用。
希望有帮助。
推荐阅读
- node.js - TypeScript 在 Express 中添加自定义请求标头
- c# - 当用户在 DataGridView 中编辑单元格时,BindingSource 不更新(简单的损坏示例)
- r - 如何动态生成数据框变量名称并使用它来处理现有数据框变量?
- ios - iTunes 如何检测 DFU 模式,我可以更改它以在 macOS 上打开另一个程序吗
- javascript - 在 JavaScript 中导出内部函数?
- python - 为什么 scipy 'cKDTree' 在查找最近点时比 'cdist' 慢?
- spring - 为什么这个最大文件大小配置不起作用?
- sql - 使用 Case 语句转换查询
- c++ - 为什么函数中用作返回值的类实例在函数返回时不调用其析构函数?
- maven - 使用本地依赖和远程