手机版

oracle数据库索引的完整解析

时间:2021-08-03 来源:互联网 编辑:宝哥软件园 浏览:

类型:数据库类大小:42.1M语言:中文评分:4.2标签:立即在关系数据库下载。索引是与表相关的数据库结构,可以使表对应的SQL语句执行得更快。索引的功能相当于书籍的目录,可以根据目录中的页码快速找到需要的内容。

对于数据库来说,索引是一个必要的选项,但是对于各种大型数据库来说,索引可以大大提高数据库的性能,使其成为数据库中不可或缺的一部分。

索引分类:

逻辑分类

Singlecolumnorconcatenated引用了一行或多行

Uniqueornonunique引号,即一列或多列的键值是否唯一。

基于函数是基于一些函数索引,在执行一些函数时需要计算这些索引。一些函数的计算结果可以提前保存和索引,以提高效率。

多曼索引数据库以外的数据使用相对较少

物理分类

B- tree:normallorefforeekey B- tree索引也是我们一直理解的一个索引。可分为正态引用索引和倒排索引。

位图:位图引用,后面会详细介绍

b树索引

B-Treeindex也是我们传统理解的常用索引。b树(balancetree)是平衡树,左右树枝相对平衡。

B-树索引

根是根节点,分支是分支节点,到底层的叶子称为叶节点。每个节点代表一个层。搜索某个数据时,先读取根节点,再读取分支节点,最后找到叶节点。叶节点存储索引条目,每个索引条目对应一条记录。

索引条目的组成部分:

Indexentryentryheader存储一些控制信息。

key column长度键的长度

Keycolumnvalue值键的值

ROWID指针,具体指向某个数据

创建索引:

用户登录:SQL conn as1/as1Connected。创建表:SQL create tabledex (id int,sexchar (1),namechar(10));表已创建。在表中插入1000条数据.1000 3循环4插入到dex值中(I,‘m’,‘石崇’);5端回路;6提交;7端;8/pl/SQL程序成功完成。检查表记录SQL从dex中选择*;身份服务人员姓名-.991米石崇992米石崇993米石崇994米石崇995米石崇996米石崇997米石崇998米石崇999米冲石1000米冲石1000排入选。创建索引:SQL在dex(id)上创建索引dex _ idx1索引已创建。注意:在表的第一列(id)上创建索引。检查创建的表和索引SQL从用户对象中选择对象名称、对象类型;对象名称对象类型索引

索引从表中分离出来,作为一个单独的个体存在。它不仅可以由单个字段创建,还可以由多个列创建。Oracle要求索引最多不超过32列。

SQL在dex(性别、姓名)上创建索引dex _ index2索引已创建。SQL从用户对象中选择对象名称、对象类型;对象名称对象类型索引表索引1索引2索引

这里需要理解:

写书,只有在章节页面设置好之后,才设置目录;数据库索引也是如此,只是先插入好的数据,然后建立索引。然后我们插入和删除数据库的内容,索引需要相应地改变。但是,索引修改是由oracle自动完成的。

上图可以更清晰地描述指数的结构。

跟随节点记录0到50条数据的位置,分支节点记录0到10条.42到50,叶节点记录每个数据的长度和值,指针指向特定的数据。

最后一层的叶子段是双向链接,它们有条不紊的链接,可以快速锁定一个数据范围。

例如:

SQL从dex中选择*其中id23和id32ID SE NAME - - - 24米石崇25米石崇26米石崇27米石崇28米石崇29米石崇30米石崇31米冲十八排入选。

例如,先找到第23个数据,然后通过索引找到第32个数据,以便快速锁定搜索范围。如果每个数据都要从根节点开始搜索,效率会很低。

位图索引

位图索引主要是为大量具有相同值的列创建的。以全国居民登记第一张表为例,假设有姓名、性别、年龄、身份证号四个字段,年龄和性别这两个字段会产生许多相同的值,而性别只有两个值,即男性和女性,年龄有1到120个值(假设最大年龄为120岁)。所以不管一个表中有几亿条记录,根据性别字段只有两个值(男和女)。那么位图索引就是基于字段这一特性的索引。

位图索引

从上图中,我们可以看到一个叶节点(用不同的颜色标识)代表一个键,StartRowID和endrowid指定了这种类型的检索范围,一个叶节点用唯一的位图值进行标记。因为一个数值类型对应一个节点,所以在查询当前行时,位图索引通过不同位图值的直接位操作(与/或)获得结果集向量(计算结果)。

举个例子:

假设有一个数据表t,有两个数据列a和b,值如下。我们可以看到a列和b列有相同的数据。

为两个数据列a和b建立位图索引:idx_t_bita和idx_t_bitb。两个索引对应的存储逻辑结构如下:

Idx_t_bita索引结构,对应叶节点:

Idx_t_bitb索引结构,对应叶节点:

在查询“选择* fromwhenreb=1和(a=' l' ora=' m ')”时

分析:位图索引和B*索引在用法上有很大区别。B*索引的使用通常从根节点开始,并将分支节点与最近的合格叶节点进行比较。通过对叶节点的连续扫描操作,结果集的rowid被“扫描”。

位图索引的工作方式非常不同。结果集向量(计算结果)通过不同位图值的直接位操作(与或)获得。

例如,可以将SQL拆分为以下操作:

1、a='L'ora='M '

A=L:矢量:1010

A=M:矢量:0001

or运算的结果是两个向量的OR运算:结果是1011。

2.将向量与b=1合并

中间结果向量:1011

B=1:矢量:1001

and运算的结果是1001。翻译过来,第一行和第四行是查询结果。

3.获取结果rowid

目前我们知道起始rowid和结束rowid,以及第一行和第四行的运算结果。结果集rowid可以通过试算得到。

位图索引的特点:

1.1的存储空间。位图索引已保存

2.位图索引创建速度很快

3.位图索引允许键值为空

4.高效访问4。表记录的位图索引

创建位图索引:

检查表记录SQL从dex中选择*;..ID SEX NAME-------991M石崇992 M石崇993 G石崇994 G石崇995 G石崇996 M姜谷市997g石崇998g石崇999g石崇1000m冲石1000行入选。对于上表,sex只有两个值,最适合创建位图引用的索引:SQL创建位图索引my _ bit _ idxondex(sex);索引已创建。查看创建引用的SQL从用户对象中选择对象名称、对象类型;对象名称对象类型我的比特IDX索引

创建索引的一些规则

1.权衡索引数量和DML之间关系,这是插入和删除数据的操作。

我们需要在这里权衡一个问题。建立索引的目的是为了提高查询效率。但是,索引太多会影响插入和删除数据的速度,因为索引会随着我们修改的表数据而被修改。这里,我们需要权衡我们的操作是更多的查询还是更多的修改。

2.将索引和相应的表放在不同的表空间中。

读取表时,表和索引同时执行。如果表和索引在同一个表空间,会有资源竞争,放在两个表中可以并行执行。

3.最好使用相同大小的块。

Oracle默认为五个块,读取一次输入/输出。如果定义6个块或10个块,则需要读取I/O两次。效率最好提高5的整数倍。

4.如果表非常大,则需要很长时间来建立索引。因为建立索引也会产生大量的重做信息,所以在创建索引时可以不设置或设置较少的重做信息。只要表数据存在,索引就无法重建,因此不需要生成重做信息。

索引的常见操作

更改索引:

SQL alter index employees _ last _ name _ idx存储(下一个400K max extends 100);

创建索引后,感觉不合理,其参数也可以修改。详见相关文件

调整索引空间:

新添加的空间SQL alter index orders _ region _ id _ idx分配扩展区(大小为200k的数据文件'/disk 6/index 01 . DBF ');可用空间SQL alter index oraers _ id _ idx解除分配未使用的;

在使用索引的过程中,可能会出现空间不足或浪费空间的情况。此时,需要添加或释放空间。以上两个命令完成了添加和释放操作。关于太空的新预言可以自动提供帮助。如果您了解数据库,可以通过手动添加来提高性能。

重新创建索引:

报价由甲骨文自动完成。当我们频繁操作数据库时,索引会被修改。当我们删除数据库中的一条记录时,对应的索引不仅仅是一个删除标记,它仍然占用空间。除非块中的所有标记都被删除,否则整个块的空间将被释放。如果长时间出现这种情况,指数的表现就会下降。此时,可以重新建立一个干净的索引来提高效率。

SQL alter index orders _ region _ id _ idx重建表空间index02

通过上面的命令,您可以重现oracle创建索引和重新建立索引的过程:

1.锁好桌子。锁表后,其他人不能在表上做任何事情。

2.创建新的(干净的)临时索引。

3.删除旧索引

4.将新索引重命名为旧索引的名称

5.打开桌子。

感动于:

事实上,当我们将索引移动到其他表空间时,我们还会在指定表空间时使用上面的命令来指定不同的表空间。新的索引是在另一个位置创建的,杀死旧的相当于移动。

SQL alter index orders _ region _ id _ idx重建表空间index03

在线重新创建索引:

如上所述,创建索引时,表被锁定,无法使用。对于大型表,重新创建索引需要很长时间。为了满足用户对表操作的需求,产生了这种在线重创建索引。

SQL alter index orders_id_idx联机重建;

创建过程:

1、锁好桌子

2.创建临时索引和空索引以及IOT表,使其存在于正在进行的DML中。键值存储在普通表中,表中的数据直接存储在IOT引用的表中;On-gongDML是用户进行添加、删除、修改的操作。

3.打开桌子

4.从旧索引创建新索引。

5.正在进行的DML信息存储在IOT表中,IOT表的内容与新创建的索引合并。

6.锁上手表

7.再次将IOT表的内容更新为新索引,并删除旧索引。

8.将新索引重命名为旧索引的名称

9.打开桌子

合并索引碎片:

如上图所示,很多索引中都有多余的空间,可以通过一个命令整合在一起。

SQL alter index orders_id_idx联合;

删除索引:

SQL删除索引hr.departments _ name _ idx

分析指数

检查结果。如前所述,索引需要很长时间才能产生大量碎片、垃圾信息和浪费的剩余空间。您可以通过重新创建索引来提高引用的性能。

您可以使用一个命令来分析索引,分析结果将存储在index_stats表中。

检查存储分析数据的表:从index _ stats中选择SQL count(*);Count (*)-0执行分析索引命令:SQL分析索引my _ bit _ idx验证结构;指数分析。再次检查index_stats是否已经有来自index _ stats的数据SQL选择计数(*);Count (*)-1查询数据:SQL从index _ stats中选择高度、名称、lf _ rows、lf _ blks、del _ lf _ rows高度名称左前_行左前_行左前_行- 2我的位_IDX 1000 3 100

分析数据分析:

(HEIGHT)引用的高度是2,(NAME)索引名是MY_BIT_IDX,(LF_ROWS)引用的表有1000行数据,(LF_BLKS)占用3个块,(DEL_LF_ROWS)删除100条记录。

这也验证了上面提到的一个问题。删除的100条数据只标记为已删除,因为数据条总数仍然是1000条,占用3个块,所以每个块大于333条记录,只有当删除的数据大于333条记录时,一个块清空时,数据条总数才会减少。

版权声明:oracle数据库索引的完整解析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。