13.oracle索引_oracle索引数据结构-程序员宅基地

技术标签: oracle  数据库  b树  

一、索引介绍
/*索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据;Oracle存储索引的数据结构是B树,位图索引也是如此,
只不过是叶子节点不同B数索引;索引由根节点、分支节点和叶子节点组成,上级索引块包含下级索引块的索引数据,叶节点包含
索引数据和确定行实际位置的rowid。*/
使用索引的目的
当查询返回的记录数排序表<40%非排序表 <7%且表的碎片较多(频繁增加、删除)时可以加快查询速度减少I/O操作消除磁盘排序

二、索引的分类及结构
1、逻辑上:
Single column/Concatenated 单行索引/多行索引
Unique/NonUnique 唯一索引/非唯一索引

2、物理上:
          B-tree B树索引即平衡树索引
          Bitmap 位图索引
          REVERSE 反向索引
          HASH索引
          Function-based基于函数的索引
          Partitioned/NonPartitioned 分区索引/非分区索引
          Domain 域索引

三、各种索引详解
/*1、 B树索引
    Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,
  默认就是在创建b-tree索引。没有特别规定可用于任何情况。
(1)特点:
    适合与大量的增、删、改(OLTP)
    不能用包含OR操作符的查询;
    适合高基数的列(唯一值多)
    典型的树状结构;
    每个结点都是数据块;
    大多都是物理上一层、两层或三层不定,逻辑上三层;
    叶子块数据是排序的,从左向右递增;
    在分支块和根块中放的是索引的范围;

(2)技巧:
    索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直接满足查询,
  而不用访问表。这就不用从表中检索数据,从而减少了I/O量。

2、位图索引
    位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的
  表。它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表。尽管位图索引最多可达30个列,但通常它们都只用于
  少量的列。
  例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女。这个基数只为2,如果用户频繁地根据Sex列的值查
  询该表,这就是位图索引的基列。当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。如果有多个可
  用的位图索引,Oracle就可以合并从每个位图索引得到的结果集,快速删除不必要的数据。
(1)特点:
    适合与决策支持系统;
    做UPDATE代价非常高;
    非常适合OR操作符的查询;
    基数比较少的时候才能建位图索引;
(2)技巧:
    对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,所以非常小,因此您可以经常检索表中超过半数的行,并且仍使用位图索引。
    当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作)方面通常要比B树做得好。当多个会话同时向表中插入行时不应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。
    在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对位图索引的存储和读取性能。

3、 反向索引
      这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值
    (10001,10002,10033,10005,10016…)
    这种情况默认索引分布过于密集,不能利用好服务器的并行
    但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。
  (1)特点:
      不可以将反转键索引与位图索引或索引组织表结合使用。因为不能对位图索引和索引组织表进行反转键处理。
  (2)技巧:
      如果您的磁盘容量有限,同时还要执行大量的有序载入,就可以使用反转键索引。

5、函数索引
    可以在表中创建基于函数的索引。如果没有基于函数的索引,任何在列上执行了函数的查询都不能使用这个列的索引。
  下面的查询就不能使用JOB列上的索引,除非它是基于函数的索引:*/

索引的分类:
按存储形式(即索引中存储的内容不同):
    1)B-TREE索引   (索引列原始数据+ROWID)
    2)位图索引     (位图+ROWID)
    3)反向键索引    (索引列原始数据的反向存储+ROWID)
    4)基于函数的索引(将索引列原始数据经函数处理后存储+ROWID)
    索引的命名规范:IND_TBNAME_COLNAME
    
1.B-TREE索引 
 (ORACLE的默认索引类型,工作中最常见、使用范围最广的索引)
  语法:
  CREATE INDEX IND_NAME ON TB_NAME(COL_NAME);
  适用场景:列基数比较大的时候使用(行业、身高)
  列基数:该列不重复数据的个数 COUNT(DISTINCT COL)

2.位图索引 (位图+ROWID)
  说明:位图索引在创建时,会扫描整张表,为索引列的每个取值建立一个不重复的位图(BITMAP)来描述该取值
  语法:
  CREATE BITMAP INDEX IND_NAME ON TB_NAME(COL_NAME);
  适用场景:列基数比较小的时候使用(性别、婚姻状况)

3.反向键索引(简称:反向索引)
  说明:可以视作一种特殊的B-TREE索引,存储索引列的反向值
  背景:为防止B-TREE索引在某叶上数据量占比过高而使用的一种索引
  语法:
  CREATE INDEX IND_NAME ON TB_NAME(COL_NAME) REVERSE;
  适用场景:原始数据分支不明显但反向数据分支明显的列(身高:集中在一米七一米八)

4.基于函数的索引
  说明:可以视作一种特殊的B-TREE索引,存储函数处理后的数据
  背景:在某个字段上以原值建立了索引,但是在筛选时在该字段上经常加函数,导致索引无法生效
  语法:
  CREATE INDEX IND_NAME ON TB_NAME(FUNCTION(COL_NAME));
  适用场景:对某列进行筛选时经常需要配合函数使用(例如查找姓名中的首字母)

二、按唯一性(索引列中的数据能否有重复值)
  1.唯一索引 --索引列中不可能出现重复值
  语法:
  CREATE UNIQUE INDEX IND_NAME ON TB_NAME(COL_NAME);
  注意点:
  1)B-TREE索引可以建立唯一索引,位图索引不能建立唯一索引
  2)如果在某列上建立了唯一约束或主键约束,ORACLE会自动在该列上建立一个同名的唯一索引
  2.非唯一索引 --索引列中可能出现重复值
  语法:CREATE INDEX IND_NAME ON TB_NAME(COL_NAME);

三、按列的个数(索引覆盖的列的个数)
  1.单列索引  --基于一个列建立的索引
  语法:
  CREATE INDEX IND_NAME ON TB_NAME(COL_NAME);
  2.复合索引(也称为联合索引) --基于两个或两个以上列建立的索引
  语法:
  CREATE INDEX IND_NAME ON TB_NAME(COL_NAME1,COL_NAME2...);

索引建立或使用的规则与建议:
/*1.如果对某大表进行筛选时,某列或某几列频繁出现在WHERE子句中,并且检索出的数据低于总行数的15%(50%),
  应考虑在这些列上建立索引。
2.如果对某大表进行排序时,某列或某几列频繁出现在ORDER BY子句中,应考虑在这些列上建立索引。
3.小表不要建立索引。
4.对于含有空值的列,如果经常在查询时查询非空值,建议在该列上建立索引;如果经常在查询时查询空值,
  建议在该列上建立基于函数的索引。
5.为了提高表连接的性能,应在连接列上建立索引(建立一般普通的索引即可)
6.索引是数据库的一种实体对象,级别类似于表,会占用内存空间,ORACLE会自动进行索引维护,表和索引
  可以建立在不同的表空间。
7.通过索引可以提升数据的查询速度,但是会相对地降低DML语句的操作速度,尤其是插和改的速度,
  ORACLE会花费时间在索引维护上,所以说要把握好索引的数量
8.对于列基数比较大的列,适合B-TREE索引,列基数比较小的列,适合位图索引。
9.对于复合索引,至少要引用到索引列中的第一个列才会使用该索引。
 (该点为早期说法,现行理论有时非第一列查询也能引用,以实际为准)
10.某列可以出现在多个索引中,但相同的某列或某几列无法多次建立索引。 --就是可以有多个组合,
   但不能有重复组合,不同顺序的相同几列视为不同组合
11.索引建立后并不一定会被引用,ORACLE会分析整个SQL后做出最优的执行方式。
12.ORACLE会自动在主键约束和唯一约束列上建立唯一索引。
13.对于一般的B-TREE索引,通配符出现在搜索词的首位时不会引用索引 (有时在首位也会走索引)
14.在索引列上使用<> !=号时,或对空值进行判断时,索引不会生效
*/
索引的删除语法:
  DROP INDEX IND_NAME;
禁用索引的语法:
  ALTER INDEX IND_NAME UNUSABLE;
重建索引的语法:
  ALTER INDEX IND_NAME REBUILD;
注意!【插入完成后统一维护索引】比【一边插入一边维护】的速度要快!

相关数据字典
所有索引
SELECT INDEX_NAME,     --索引名称
       INDEX_TYPE,     --索引类型
       TABLE_NAME,     --表名
       UNIQUENESS,     --是否唯一
       STATUS,         --索引状态  VALID 可用的 UNUSABLE 不可用的
       TABLESPACE_NAME,--表空间
       LOGGING         --是否记录日志
  FROM USER_INDEXES
 WHERE 1=1
   AND INDEX_NAME = 'IND_EMP_DEPTNO'
   AND TABLE_NAME = 'EMP';
   
索引函数
SELECT INDEX_NAME, --索引名称
       TABLE_NAME, --表名
       COLUMN_EXPRESSION --列表达式
  FROM USER_IND_EXPRESSIONS
  WHERE INDEX_NAME ='IND_EMP_UPENAME';
  
  
  
  
四、索引创建完整版
CREATE UNIQUE | BITMAP INDEX <schema>.<index_name>
      ON <schema>.<table_name>
           (<column_name> | <expression> ASC | DESC,
            <column_name> | <expression> ASC | DESC,...)
     TABLESPACE <tablespace_name>
     STORAGE <storage_settings>
     LOGGING | NOLOGGING
     COMPUTE STATISTICS
     NOCOMPRESS | COMPRESS<nn>
     NOSORT | REVERSE
     PARTITION | GLOBAL PARTITION<partition_setting>

UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”
TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
STORAGE:可进一步设置表空间的存储参数
LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
COMPUTE STATISTICS:创建新索引时收集统计信息
NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45298339/article/details/130522203

智能推荐

leetcode 172. 阶乘后的零-程序员宅基地

文章浏览阅读63次。题目给定一个整数 n,返回 n! 结果尾数中零的数量。解题思路每个0都是由2 * 5得来的,相当于要求n!分解成质因子后2 * 5的数目,由于n中2的数目肯定是要大于5的数目,所以我们只需要求出n!中5的数目。C++代码class Solution {public: int trailingZeroes(int n) { ...

Day15-【Java SE进阶】IO流(一):File、IO流概述、File文件对象的创建、字节输入输出流FileInputStream FileoutputStream、释放资源。_outputstream释放-程序员宅基地

文章浏览阅读992次,点赞27次,收藏15次。UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。文件字节输入流:每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1。注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。UTF-8字符集:汉字占3个字节,英文、数字占1个字节。GBK字符集:汉字占2个字节,英文、数字占1个字节。GBK规定:汉字的第一个字节的第一位必须是1。_outputstream释放

jeecgboot重新登录_jeecg 登录自动退出-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏3次。解决jeecgboot每次登录进去都会弹出请重新登录问题,在utils文件下找到request.js文件注释这段代码即可_jeecg 登录自动退出

数据中心供配电系统负荷计算实例分析-程序员宅基地

文章浏览阅读3.4k次。我国目前普遍采用需要系数法和二项式系数法确定用电设备的负荷,其中需要系数法是国际上普遍采用的确定计算负荷的方法,最为简便;而二项式系数法在确定设备台数较少且各台设备容量差..._数据中心用电负荷统计变压器

HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板_网页设计成品百度网盘-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏46次。HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业_网页设计成品百度网盘

【Jailhouse 文章】Look Mum, no VM Exits_jailhouse sr-iov-程序员宅基地

文章浏览阅读392次。jailhouse 文章翻译,Look Mum, no VM Exits!_jailhouse sr-iov

随便推点

chatgpt赋能python:Python怎么删除文件中的某一行_python 删除文件特定几行-程序员宅基地

文章浏览阅读751次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python 删除文件特定几行

Java过滤特殊字符的正则表达式_java正则表达式过滤特殊字符-程序员宅基地

文章浏览阅读2.1k次。【代码】Java过滤特殊字符的正则表达式。_java正则表达式过滤特殊字符

CSS中设置背景的7个属性及简写background注意点_background设置背景图片-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏17次。css中背景的设置至关重要,也是一个难点,因为属性众多,对应的属性值也比较多,这里详细的列举了背景相关的7个属性及对应的属性值,并附上演示代码,后期要用的话,可以随时查看,那我们坐稳开车了······1: background-color 设置背景颜色2:background-image来设置背景图片- 语法:background-image:url(相对路径);-可以同时为一个元素指定背景颜色和背景图片,这样背景颜色将会作为背景图片的底色,一般情况下设置背景..._background设置背景图片

Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏8次。Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程

PyCharm2021安装教程-程序员宅基地

文章浏览阅读10w+次,点赞653次,收藏3k次。Windows安装pycharm教程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入下载安装PyCharm1、进入官网PyCharm的下载地址:http://www.jetbrains.com/pycharm/downl_pycharm2021

《跨境电商——速卖通搜索排名规则解析与SEO技术》一一1.1 初识速卖通的搜索引擎...-程序员宅基地

文章浏览阅读835次。本节书摘来自异步社区出版社《跨境电商——速卖通搜索排名规则解析与SEO技术》一书中的第1章,第1.1节,作者: 冯晓宁,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.1 初识速卖通的搜索引擎1.1.1 初识速卖通搜索作为速卖通卖家都应该知道,速卖通经常被视为“国际版的淘宝”。那么请想一下,普通消费者在淘宝网上购买商品的时候,他的行为应该..._跨境电商 速卖通搜索排名规则解析与seo技术 pdf

推荐文章

热门文章

相关标签