• 售前

  • 售后

热门帖子
入门百科

Oracle索引(B*tree与Bitmap)的学习总结

[复制链接]
上帝从不眨眼 显示全部楼层 发表于 2021-10-26 13:32:43 |阅读模式 打印 上一主题 下一主题
在Oracle中,索引基天职为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,此中最常用的是B*Tree索引和Bitmap索引。
(1)、与索引相干视图
查询DBA_INDEXES视图可得到表中全部索引的列表;访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
(2)、组合索引概念
当某个索引包罗有多个已索引的列时,称这个索引为组合(concatented)索引。
注意:只有在利用到索引的前导索引时才可以利用组合索引
(3)、B*Tree索引
B*Tree索引是最常见的索引结构,默认建立的索引就是这种范例的索引。B*Tree索引在检索高基数数据列(高基数数据列是指该列有许多差别的值)时提供了最好的性能。
DML语句:
Create index indexname on tablename(columnname[columnname...])
B-tree特性:
得当与大量的增、删、改(OLTP);
不能用包罗OR操纵符的查询;
得当高基数的列(唯一值多);
典范的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围。
(4)、Bitmap索引
位图索引重要用于决策支持体系或静态数据,不支持行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零)。
DML语句:
Create BITMAP index indexname on tablename(columnname[columnname...])
Bitmap特性:
得当与决策支持体系;
做UPDATE代价非常高;
非常得当OR操纵符的查询;
基数比较少的时候才能建位图索引。
(5)、B*tree和Bitmap的差别
在一颗 B* 树中,通常索引条目和行之间存在一种一对一的关系:一个索引条目就指向一行;而对于位图索引,一个索引条目则利用一个位图同时指向多行。
位图索引实用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个差别值)。B*tree索引的话通常在访问小数据量的环境下比较实用,比如你访问不凌驾表中数据的5%,实用于一般的环境;bitmap的话在数据堆栈中利用较多,用于低基数列,比如性别之类重复值许多的字段,基数越小越好。
(6)、导致索引失效的环境
  利用未便是操纵符(<>、!=)
通常把未便是操纵符改成OR条件,就可以利用索引,以制止全表扫描
  利用IS NULL 或IS NOT NULL
利用IS NULL 或IS NOT NULL同样会限定索引的利用。由于NULL值并没有被界说。在SQL语句中利用NULL会有许多的贫苦。因此建议开发职员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会利用这个索引(除非索引是一个位图索引)。
  利用函数
如果不利用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列利用函数时,会使优化器忽略掉这些索引。
  比较不匹配的数据范例
不匹配的数据范例之间比较会让Oracle自动限定索引的利用,即便对这个查询实行Explain Plan也不能让您明白为什么做了一次”全表扫描”。
复合索引中的前导列没有被作为查询条件
复合索引中,肯定要将前导列作为查询条件,索引才会被利用
  CBO模式下选择的行数比例过大,优化器采取了全表扫描
这是基于代价的优化考虑

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作