文档结构如下:
前言:
官方文档中对索引的描述确实很薄弱。 索引的描述只是一坨……并没有什么好的信息。 以下是本人整理的官方内容以及网上的资料; 至于为什么要用索引,以及索引的重要性,相信大家都知道; 如果数据库中的所有表都像一本书,那么索引就是这本书的目录,你不能每次都从第一页读到最后一页书的内容,不要使用目录! !
索引类型:
索引是与表和簇关联的可选结构,允许 SQL 查询对表更快地执行。 正如本手册中的索引可帮助您更快地查找信息(无需索引)一样,数据库索引提供了对表数据的更快访问路径。 您可以使用索引而无需重写任何查询。 结果是相同的,但看到的速度更快。
该数据库提供了多种索引方案,可提供互补的性能特征。 这些都是:
索引在逻辑上和物理上独立于关联表中的数据。 作为独立的结构,它们需要存储空间。 您可以创建或删除索引,而不会影响基表、数据库应用程序或其他索引。 当您插入、更新和删除关联表的行时,数据库会自动维护索引。 如果删除索引,所有应用程序将继续运行。 但是,访问先前索引的数据可能会更慢。
1. 索引管理指南:
插入表数据后创建索引
通常使用 SQL* 或导入实用程序将数据插入或加载到表中。
适合索引的场景索引的适用场景:
使用以下准则来确定何时创建索引:
适合索引的列(官方说法可能不准确)
有些列非常适合建立索引。 具有以下一项或多项特征的列是索引的候选列:
其中 COL_X > -9.99 * power(10,125) ;
其中 COL_X 不为空;
这是因为第一个使用索引作为索引 COL_X(假设 COL_X 是数字列)。
实验如下:
表测试为 * from ;
测试集=;
测试集 = null 其中 >10000;
;
test() 上的索引;
开始
.('sys','test',=>true);
结尾;
/
放
* 来自测试,其中为空;
其实官方说的也不是特别正确(IS NOT NULL的范围还在15%以内,所以还是取索引)
以下是超过15%的范围
开始
.('sys','t1',=>true);
结尾;
/
其实官方说的也不是特别正确(IS NOT NULL的范围还是在50%>15%以内,所以进行了全表扫描)
索引列性能
INDEX 语句中列的顺序会影响查询性能。 通常,首先指定最常用的列。
如果要创建跨越,则访问列表索引(例如col1、col2和col3)的查询会加快; 然后,仅访问 col1 或仅访问 col1 和 col2 的查询也将加快。 但是仅访问 col2、仅访问 col3 或仅访问 col2 和 col3 的查询不使用索引。
限制每个表的索引数量
一个表可以有任意数量的索引。 然而,索引越多,修改表的成本就越高。 具体来说,当插入或删除行时,表上的所有索引也必须更新。 此外,当更新列时,包含该列的所有索引都必须更新。
因此,从表中检索数据的速度和更新表的速度之间需要进行权衡。 例如,如果表主要是只读的,那么拥有更多索引会很有用。 但如果表更新频繁,最好使用较少的索引。
删除不再需要的索引
如果出现以下情况,请考虑删除索引:
估计索引大小并设置存储参数
在创建索引之前估计索引的大小可以促进更好的磁盘空间规划和管理。 您可以使用索引的估计大小以及表、撤消表空间和重做日志文件的估计大小的组合来确定保存目标数据库所需的磁盘空间量。 根据这些估计,您可以做出正确的硬件购买和其他决策。
使用单个索引的估计大小可以更好地管理索引使用的磁盘空间。 创建索引后,您可以设置合适的存储参数,提高使用该索引的应用程序的I/O性能。 例如,假设您在创建索引之前估计了索引的最大大小。 如果在创建索引时设置了存储参数,则为表数据段分配的盘区会减少,所有索引数据都存储在磁盘空间中相对连续的部分。 这减少了涉及索引的磁盘 I/O 操作所需的时间。
单个索引条目的最大大小大约是数据块大小的一半。
有两种方法可以设置为索引创建的索引段的存储参数,用于强制执行主键或唯一键约束:
指定每个索引的表空间
可以在任何表空间中创建索引。 索引可以创建在与其索引的表相同或不同的表空间中。 如果表及其索引使用相同的表空间,则可以更方便地执行数据库维护(例如表空间或文件备份)或确保应用程序可用性。 所有相关数据始终在线。
与将表和索引存储在同一表空间中相比,对表及其索引使用不同的表空间(在不同的磁盘上)可以获得更好的性能。 减少磁盘争用。 但是,如果您对一个表使用不同的表空间,并且该表的索引一表空间处于脱机状态(包含数据或索引),则不能保证引用该表的语句能够正常工作。
考虑并行索引创建
您可以像并行表创建一样并行化索引创建。 由于多个进程一起创建索引,因此数据库创建索引的速度比单个服务器进程按顺序创建索引的速度要快。
并行创建索引时,每个查询服务器进程分别使用存储参数。 因此,初始值为5M、并行度为12创建的索引在索引创建过程中至少会消耗60M的存储空间。
考虑使用创建索引
通过在 INDEX 语句中指定它,可以创建索引并生成最少的重做日志记录。
创建索引有以下好处:
一般来说,创建较大索引的相对性能改进大于创建较小索引的相对性能改进。 创建小索引对创建索引所需的时间影响不大。 但是,对于较大的索引,性能改进可能会很显着,特别是如果您还并行化索引创建。
考虑合并或重建索引的成本和收益
大小不正确或增长增加可能会产生索引碎片。 要消除或减少碎片,您可以重建或合并索引。 但在执行任何一项任务之前,请权衡每种选项的成本和收益,然后选择最适合您情况的一项。 是与重建和合并索引相关的成本和收益的比较。
当 B 树索引叶块以供重用时,可以使用以下语句合并这些叶块:
改变索引;
在禁用或删除约束之前考虑成本
由于唯一键和主键具有关联的索引,因此在考虑是否禁用或删除 KEY 约束时应考虑删除和创建索引的成本。 如果键或 KEY 约束的关联索引非常大,您可以通过启用约束来节省时间,而不是删除并重新创建大索引。 您还可以选择在删除或禁用 OR KEY 约束时显式指定要保留或删除索引。
基于函数的创建索引 创建在线索引(生产)
例如,在生产中,有一个大型分区表需要创建索引。 如果直接执行索引的话,估计会直接挂掉。 索引需要使用关键字在线创建和重建索引。 在基表上构建或重建索引时可以更新基表,构建索引时可以执行DML操作,但不允许进行DDL操作。 在线创建或重建索引时,不支持并行执行。 如下:
emp 索引(mgr, emp1, emp2, emp3);
注意:
完成在线索引构建所需的时间与表的大小和并发执行的 DML 语句的数量成正比。 因此,最好在 DML 活动较少时开始在线索引构建。
收集有关索引创建(生产)的附带统计信息
数据库使您有机会在索引创建或重建期间以很少的资源成本收集统计信息。 这些统计信息存储在数据字典中,供优化器在选择执行 SQL 语句的计划时继续使用。 以下声明:
索引 小时开小时()
;
当可以在线创建大表并收集统计信息时
创建密钥压缩索引
创建具有键压缩的索引可以消除重复的键列前缀值。
键压缩将索引键拆分为前缀和后缀条目。 压缩是通过在索引块的所有后缀条目之间共享前缀条目来实现的。 这种共享节省了大量空间,允许您在每个索引块存储更多键,同时提高性能。
密钥压缩在以下情况下很有用:
您可以使用该子句启用密钥压缩。 还可以指定前缀长度(作为键列的数量)来标识如何将键列拆分为前缀和后缀条目。 例如,以下语句压缩索引叶块中的重复键:
emp(ename) 上的索引
用户
1;
解压:
改变索引;
创建不可见索引
从版本 11g 开始,可以创建不可见索引。 除非您在会话或系统级别显式地将索引初始化参数设置为 TRUE,否则优化器会忽略不可见索引。 使索引不可见是使其不可用或删除的另一种选择。 使用不可见索引,您可以执行以下操作:
与不可用索引不同,不可见索引是在 DML 语句期间维护的。
要创建不可见索引,请在子句中使用 INDEX SQL 语句。 以下语句创建一个以表的 ename 列命名的不可见索引 emp:
emp(ename) 上的索引
用户
(20K
下一个 20k
75)
;
二、创建索引语法 1、索引分类:
该数据库提供了多种索引方案,可提供互补的性能特征。 这些都是:
以下是在网上找到的相关类别
逻辑上:
单行索引
多行索引
唯一索引
非唯一索引
基于函数的索引
域索引
物理上:
分区索引
非分区索引
B树
普通B树
Rever Key 反向 B 树
位图索引
全文索引
本节介绍如何创建索引。 要在您自己的模式中创建索引,必须至少满足以下条件之一:
要在另一个模式中创建索引,必须满足以下所有条件:
2.创建btree索引
语法如下:
表为 * 来自 ;
设置=;
下面是创建索引
() 上的索引;
B树应用场景:
非常适合数据重复率较低的字段,比如ID等有唯一约束的字段。
3.创建btmap索引
() 上的索引;
应用场景:
重复率高的键值; 位图索引只存储键值的起止Rowid和位图,因此占用的空间很少,并且索引中的一次dml操作会影响一个位图段(相同的键值)。 严重影响频繁的DML(极易造成会话挂起),造成死锁。
受限位图索引受到以下限制:
4、创建域索引(索引为全文索引)
要在您自己的模式中创建域索引,除了创建常规索引的先决条件之外,您还必须具有索引类型的对象权限。 如果要在另一个用户的架构中创建域索引,则索引所有者还必须对索引类型及其底层实现类型拥有对象权限。 在创建域索引之前,首先应定义索引类型。
b-tree,无法发挥作用的场景,如‘%%’模糊匹配; 占用磁盘空间太大(全文索引是原表的1.5倍左右,重建成本很高),维护成本高。
支持四种类型的索引:
,,,
下面仅使用索引。
索引 () 是 .;
* 从哪里 (,'') >1;
查看执行计划:
检查执行计划并使用全文索引。 如果是其他用户,创建文本索引时需要授权(详细步骤不再深入)。
5. 创建(聚簇)索引
创建语法如下:
这是一个例子:
由于这不是一张普通的表(堆表),我们一般使用的普通的是堆表,簇索引是根据建表语句来的:
创建集群:
示例创建
以下语句创建一个由 key 命名的簇,簇大小和存储参数值为 512 字节:
( (4)) 大小 512(100K 接下来 50K);
该示例在键上创建索引
索引;
将表添加到集群中:
桌子
()
AS * 从 hr. 其中 = 10;
桌子
()
AS * 从 hr. 其中 = 20;
要说使用环境,就只能是一张桌子了。 下面的环境使用表是什么:
如果一组表有一些公共列,则将这样一组表存储在同一个数据库块中; 集群还意味着将相关数据存储在同一块上。 通过集群,一个块可以包含来自多个表的数据。 其概念是,如果两个或多个表频繁连接,则可以预先将所需数据存储在一起。 集群也可以用于单个表,其中数据可以按特定列分组和存储。
何时不应使用聚类:
1) 如果预计集群中的表将被大量修改:必须知道索引集群可能会对 DML(尤其是语句)的性能产生某种负面影响。 管理集群中的数据需要更多工作。
2)如果需要对集群中的表进行全表扫描:不仅要对自己表中的数据进行全表扫描,还必须对(可能)多个表中的数据进行全表扫描。 全表扫描需要更长的时间,因为需要扫描更多数据。
3)如果您认为需要频繁加载表:集群中的表不能被截断。 这是显而易见的,因为集群在一个块上存储多个表,并且必须删除集群表中的行。
因此,如果数据主要是读(这并不意味着“从不写”;聚簇表是完全可修改的),通过索引(聚簇键索引或者其他索引)来读取,信息会被频繁join在一起,此时聚类就非常合适了。
6.创建哈希簇索引
类似于5:
((3))
尺码 512 10
(100k 接下来 50k);
(, CHAR(2))
20
哈希为 MOD(+, 101);
单哈希情况:
((6))
尺寸 512 表 100;
7.全局索引和本地索引(分区表)
用过分区表的人都知道这一点。 我的博客地址专门解释了全局索引和本地索引:
(主要是综合指标)
8.反向键索引(mysql也有)
1.反向指数应用场合
1)当发现索引叶子块成为热块时使用
通常,数据在使用时(常用于批量插入操作),都集中在连续的数据范围内,因此使用普通索引时,很容易使索引叶子块过热,严重时会导致系统性能下降案例。
2)RAC环境下使用
在RAC环境中多个节点访问数据具有集中性和密度的特点时,出现索引热点块的概率会非常高。 如果系统对范围检索要求不高,可以考虑使用反向索引技术来提高系统性能。 因此该技术在RAC环境中比较常见,可以显着减少索引块的争用。
2.使用倒排索引的优点
最大的好处是减少索引叶块的争用,减少热块,提高系统性能。
3、使用倒排索引的缺点
由于倒排索引结构本身的特点,如果系统经常使用范围扫描读取数据(例如在where子句中使用“and”语句或者比较运算符“>”)7902;
执行范围查询时,会执行全表扫描。
9. 函数索引
基于函数的索引对于限定函数或表达式返回值的查询非常有用。 函数或表达式的值被预先计算并存储在索引中。
除了创建常规索引的前提条件外,如果索引是基于用户定义的函数,则必须对这些函数进行标记。 此外,如果基于函数的索引由另一个用户拥有,则只有对象权限可用于这些用户定义的函数。
此外,要使用基于函数的索引:
该索引被标记为无效,必须使用 INDEX... 语句进行验证。
例如:
小时索引 ((, 0, 3));
指数; -- 检查索引是否有效
* 从哪里 = '';
t.,(, 1, 3) 从小时。 t WHERE t.='苏珊';
10. 创建基于约束的索引
单独创建唯一索引:
部门索引(dname)
指数;
基于唯一约束创建索引:
以下为情况1、2、3:
表一(
a1 INT KEY USING INDEX ( a (a1)) 上的索引 ai);
表 b(
b1 INT,
b2 INT,
bu1(b1,b2)
USING INDEX(b(b1, b2) 上的索引 bi),
bu2 (b2, b1) 使用索引 bi);
表 c(c1 INT, c2 INT);
索引 ci ON c (c1, c2);
更改表 c 添加 cpk 密钥 (c1) 使用索引 ci;
三、变化指标
指数变化包括以下内容:
要更改索引,您的架构必须包含该索引,或者您必须具有 ALTER ANY INDEX 系统权限。 使用 ALTER INDEX 语句,您可以:
其他的应该比较常见,不常见的是最后一个,它启用或停止监视索引使用情况。
ALTER INDEX 索引用法;
例如:
更改索引 小时用法;
*来自V$;
ALTER INDEX 索引用法;
更改索引 小时用法;
*来自V$;
可以在视图中查询正在监控的索引,看看它是否已经在使用中。 该视图包含一个值为 OR 的列,具体取决于在监视的时间段内是否使用了索引。 该视图还包含监控周期的开始和停止时间,
每次指定 USAGE 时,V$ 都会重置指定索引的视图。 以前的使用信息将被清除或重置,并记录新的开始时间。 当指定USAGE时,将不再进行进一步的监控,并记录监控时间的结束时间。 查看信息将保持不变,直到使用 ALTER INDEX...USAGE 发出下一条语句。
四、索引数据字典视图
分区表中没有设计相关索引
看法
笔记
DBA视图描述了数据库中所有表的索引。 ALL 视图描述用户可访问的所有表上的索引。 USER 视图仅限于用户拥有的索引。 这些视图中的某些列包含由包或语句生成的统计信息。
这些视图描述表上的索引列。 这些视图中的某些列包含由包或语句生成的统计信息。
这些视图描述了表上基于函数的索引的表达式。
这些视图包含索引的优化器统计信息。
存储最后一个 INDEX... 语句的信息。
存储最后一个 INDEX... 语句的信息。
V$
包含由 ALTER INDEX...USAGE 函数生成的索引使用信息。
信息来自官方: