类型:数据库类大小: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条记录时,一个块清空时,数据条总数才会减少。