oracle 索引基础相关

#######################查询一个表上的全部索引######################################

select
      a.table_name, a.index_name, b.column_name, a.uniqueness, a.visibility 
from  
       user_indexes a, user_ind_columns b
where
    a.index_name = b.index_name and  a.table_name -'DEPT';

#######################查询数据库是CDB还是非CDB######################################

select  name,created,cdb,con_id  from v$database;

#######################查询PDB######################################

select  name,open_mode,open_time  from v$pdbs;

#######################索引技术######################################

索引对性能的改进程度取决于数据的选择性以及数据在表的数据块中的分布方式。

在执行全表扫描时,oracle使用多块读取的方式快速扫描表,基于索引的读是单块读。

通常来说,在表上加一个索引会使该表上insert操作的执行时间变成原来的三倍;再加一个索引,就会再慢一倍;然而一个复合索引(两个或多个列)并不比只有一个列的索引差很多。

通过索引的查询逻辑:

执行SQL语句,优化器会使用合适的索引查找该值,并找到对应的 ROWID,接着使用该ROWID在表对应的磁盘块上查找数据行。

#######################查询表上的索引######################################

select  table_name,index_name 
from  user_indexes
where  table_name='EMP'

#######################查询表上索引对应的列名######################################

select table_name, index_name, column_name, column_position
from user_ind_columns 
order by table_name, index_name, column_position;

#######################查询索引是否设置为不可见######################################

select
           a.table_name, a.index_name,b.column_name, a.uniqueness, a.visibility 
from
           user_indexes a, user_ind_columns b
where
           a.index_name = b.index_name and a.table_name ='DEPT';
通过使用不可见索引,可以在同一列或相同的多个列上创建多个索引。
比如可以白天使用B树索引;晚上使用反向键索引。

#######################复合索引######################################

当某个索引包含多个列时,称为“复合索引”。oracle引入索引跳跃式扫描增加了优化器在使用复合索引时的选择,所以复合索引中列的顺序非常关键。
一般来说,索引的第一个列应该是最有可能在where中使用的列,并且应该是索引中最具有选择性的列。
在引入跳跃式扫描功能之前,只有当索引的前导列出现在where子句时,查询才能使用该索引。换言之,如果where中没有出现索引的前导列,执行计划可能就不使用该索引。
在引入跳跃式扫描功能之后,即使where中没有出现索引的前导列,优化器会仍然使用该索引,优化器可能会选择索引快速全扫描(index fast full scan)或全表扫描或索引跳跃式扫描。

两种常见的索引扫描方式:唯一扫描(unique scan)和范围扫描(range scan)。
在唯一扫描中,数据库知道所以包含的每个值都是唯一的。
在范围扫描中,数据库讲根据查询条件从索引中返回多个符合条件的值。

#######################不等于运算和NULL######################################

索引只能用于查找表中已存在的数据。当在where子句中使用不等于运算符时,其中被用到的列上的索引都无法使用。

如果在where中使用is null或is not null,oracle不会在B+树中对NULL值进行索引。遇到NULL的情况除非使用位图索引。这也是为什么在创建表时,对列指定not null约束会禁用NULL值,也是避免了NULL值引起的索引相关性能的问题。

####################### like  '%XXX%' 和 like  ‘X%’######################################

like 'X%'是可以使用索引的,但是like '%XX%' 在oracle 12c中仍然没有办法使用索引。

#######################使用函数######################################

在where 条件中等号左边如果出现了函数,函数处理的列上的索引将无法使用。

除非使用基于函数的索引,可以改变这个现状。

#######################比较不匹配的数据类型######################################

oracle对于不匹配的数据类型不仅不会报错,反而会进行隐式的数据类型转换。这个带来了巨大的性能问题。

#######################聚簇因子######################################

索引与其所在的表相比较的有序性度量,用于检查在索引访问之后执行的表查找的成本。聚簇因子记录在扫描索引时需要读取的数据块数量。

如果使用的索引具有较大的聚簇因子,就必须访问更多的表数据块才可以获得每个索引块中对应的数据行。

如果聚簇因子接近于表中数据块的数量,就表示索引对应数据行的排序状况良好;

如果聚簇因子接近于表中数据行的数量,就表示索引对应的数据块排序状况不佳。

#######################二元高度######################################

所谓的二元高度,其实就索引树的层级。

#######################直方图######################################

oracle的直方图是高度均衡而不是宽度均衡。高度均衡的直方图里所有桶都有相同的行数。桶的起点和终点取决于包含这些值的行数。

宽度的直方图规定每个存储桶的值的范围,然后统计出这个范围的行数,可能会导致桶的行数差异很大,这个显然不理想。

#######################快速全扫描######################################

在索引的快速全扫描过程中,oracle读取B树索引上的所有叶子块。这个索引可以顺序方式读取,这样一次可以读取多少块。

初始化文件中DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同事被读取的块数的数目。

INDEX(FAST_FULL_SCAN)

相比全表扫描,快速全扫描需要更少的物理IO,并且查询可以更快的完成。

我的理解是 在三星索引的情况下(查询列,where列都在索引中)的时候会发生快速全扫描。

#######################跳跃式扫描######################################

索引跳跃式扫描的特性允许优化器使用复合索引,即便是索引的前导列没有在where中。索引跳跃式扫描比索引全扫描快的多,因为只需要执行少量的读操作。

INDEX(SKIP_SCAN)

猜你喜欢

转载自blog.csdn.net/David_ifx/article/details/115193349