Oracle索引技术研究
Oracle索引类型
B树索引
特定类型索引
确定索引列
主键和唯一键值列的索引
外键索引
其他合适的索引列
B树索引
B树索引算法
B树是指B-tree(Balanced Tree),B树的存在是为了存储设备而设计的一种多分叉的树。B树中
- 每个节点至多含有m个子节点
- 每个非叶子节点除了根节点之外至少含有⌈m/2⌉个子节点
- 根节点至少含有2个子节点否则它是叶子节点
- 有k个子节点的非叶子节点包含k-1个键值
- 所有叶子节点出现在同一层
其中,m称为该B树的阶,一个3阶B树的节点的排列如同
【指针】键值【指针】键值【指针】
当遍历到该节点时顺次搜索键值,根据大小比较去向该键值前的指针指向的子节点还是该节点后的指针指向的。
B+-tree是B-tree的演变
区别在于B+树的每个索引键值对应一个子节点,然后叶子节点保持对齐(Balanced)
B树索引子类型
索引组织表
索引组织表IOT在一个B树索引结构中存储表行的所有内容
创建索引组织表
CREATE TABLE … ORGANIZATION
索引组织表是一类特殊的表,它将索引和表的数据存储在一起。普通表的数据以无序(Heap)的方式存放在数据库中。而索引组织表按照主键进行排序,以二叉树(B树)的方式对表的数据进行存储。索引组织表不需要列ID,而是通过主键直接对表的数据进行访问。
索引组织表的优点
- 快速随机访问:索引和表存储在一起,表就是索引自身,oracle只需要索引就可以更新表
- 快速范围扫描:(Range)所有的数据都是按照主键进行排序的,所以扫描速度非常容易接近logN
- 存储需求变少:索引和表存储在一起减少了索引的存储空间
缺点:
和访问十分快速的位图索引一样,索引组织表的缺点在于更新表中的内容会导致大规模的索引重建,因此索引组织表不是以用于频繁数据变动的表中。
唯一索引
类似于唯一键值约束,唯一索引保证所有插入表中的非空键值都是不同的。
创建唯一索引通常与主键和唯一约束联合使用
CREATE UNIQUE INDEX
反向键索引
反向键索引可以应对大量顺序插入索引的IO,能够均匀的分布索引数据避免相似的键值大量的聚集在一起。
创建反向索引
CREATE INDEX cust_ridx1 ON cust(cust_id) REVERSE
不能对位图索引或索引组织表指定REVERSE语句
反向键索引不能是降序类型
反向键索引的思路跟传统索引的思路正好相反,传统的索引思路对密集型数据区域会增加索引密度以达到提升改高频访问地带搜索效率的目的。但是反向键索引思路相反, 为了防止局部过热(在数据规模过大的情况向有可能高频热点数据塞满了某一块磁盘的通道导致该局部数据过热)有大量顺序数据插入导致该分区表索引树极其不平衡的情况下,将建索引的值进行反向操作。
绝对正向有序的数据在连续插入索引是,如果索引的键值方案是反向,则绝对正向有序的数据退化为随机数据(不是绝对反向数据),进而我们保持了所引述的平衡性。否则,索引树在大量顺序插入时极端不平衡导致一侧分支的I/O次数大量增加,进而产生前文说明的局部过热问题。
键压缩索引
减少前导列经常重复的组合索引,使用COMPRESS N创建压缩索引
CREATE INDEX cust_cidx_1 ON cust(last_name, first_name) COMPRESS 2
不能在位图索引上创建压缩索引
降序索引
B树的算法中默认索引是升序索引,创建降序索引,可以通过DESC关键词反转降序
譬如,在大数值密集型的数据中降序索引速度很快。
CREATE INDEX cust_didx1
ON CUST(cust_id DESC);
特定索引类型
特定索引类型是专用于特定情况下的索引类型。
位图索引
位图索引常用于数据仓库环境中,适用于相对较低数量不同值的列。
经常使用INSERT/UPDATE/DELETE等操作的数据库不应使用位图索引,因为位图索引会在DML操作期间锁定多个行
使用关键字BITMAP创建位图索引
CREATE BITMAP index f_sales_fk1
ON f_sales(d_date_id);
位图索引算法
位图索引把某一列的所有值枚举出来后按位的方式(1/0)的方法列后,对所有值为该枚举量的列标注为1
如test表中有state这样一列,10行数据如下:
10 20 30 20 10 30 10 30 20 30
那么会建立三个位图,如下:
BLOCK1 KEY=10 1 0 0 0 1 0 1 0 0 0
BLOCK2 KEY=20 1 0 0 0 1 0 1 0 0 0
BLOCK3 KEY=30 1 0 0 0 1 0 1 0 0 0
位图索引统计的速度很快,对行列进行连贯的按位操作是非常迅速地。但是缺点是实体不应该经常改变,因为所有的列与所有枚举值都有一一对应关系,经常变动的实体集对位图索引的变动范围非常大。
基于函数的索引
基于定义的SQL函数或表达式创建的索引
CREATE
INDEX cust_fidx1
ON
cust(upper(last_name));
分区索引
分区索引在逻辑上是一个索引,但是在不同的段中实现,能够保证很大的数据库也有良好的性能。(分区索引是oracle的付费服务)
全局分区索引不映射到基础表的段,可以为常规表或分区表建立全局分区索引,用B树实现,使用GLOBAL PARTITION创建全局分区索引
CREATE
INDEX f_sales_gidx1 ON f_sales(sales_amt)
GLOBAL
PARTITION BY RANGE(sales_amt)P
PARTITION pg1 VALUES LESS THAN (25),
PARTITION pg1 VALUES LESS THAN (50),
PARTITION pg1 VALUES LESS THAN (maxvalue));
本地分区索引必须建立在分区表上,与基础表遵循相同的分区策略。
分区表与索引
分区表刚开始让我联想到磁盘的MBR分区表和GPT分区表。在oracle数据库中从10支持多种分区表。分区表类似于磁盘分区,为数据添加物理隔断,分区表之间是物理不相关联的。这样做的好处是即便某个分区表的物理存储损坏也不会影响到其他数据。
分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有影响。
为分区表创建分区时主键必须包含分区列,并且不能创建额外的约束,原因还是物理空间的独立隔离。
局部索引与全局索引
全局索引,就是索引跨越分区表,在做跨分区查询优势快;
局部索引,分区表某个分区的索引,速度比全局快,而且维护更方便
;
全局索引和局部索引的概念是与分区表有关的。全局索引和局部索引的机制不同,全局索引既可以分区也可以不分区,但是全局索引必须是前缀索引。
优化索引的方法
索引与约束相关
索引与约束相关相当于在索引期间就依照实体集的约束进行有条件的判断。由于所有索引的依据都是它对应的实体集合,因此实体集合的约束就是索引的约束,索引约束是对无效搜索在索引阶段进行提前判断的有效方法。
创建局部区索引
局部索引一方面节约大量的磁盘IO和存储空间开支,因为只对实体集合的局部进行索引大幅度减少索引的存储量;另一方面局部索引是对高频访问的实体区域进行有针对性的高密度索引,让查找的速度尽量推进logN。
基础表必须是分区表
基础表构建为分区表一方面是处于保护数据的目的,将不相关的物理设计进行隔离,另一方面保持所有基础表单数据独立性映射到物理设计中的分离方法,有利于对数据的操作逻辑规划与效能分析的对应关系建立
心得与总结
通过本学期的数据库学习和Oracle数据库索引技术的研究,我对数据库技术有了更加全面的认识。
最开始接触到数据库是网站方面的需求,往往会选择较为流行和配置简单的mysql数据库进行数据操作。使用到的功能一般也只有基础的数据库表操作,完全是当作一个性能增强的excel使用。通过本学期的数据库学习我对oracle数据库包括整个数据库体系有了完整的认识,包括从抽象概念定义和基本的物理定义都有了清晰的了解,懂得了数据库的数据关系和数据操作的思想。
特别是数据库索引技术的扩展研究,让我对大规模数据管理和系统假设的要点有了认识,同时应用到了课程中学到的基本数据库模型和一些磁盘相关的知识。巩固了基础的Balance树算法和构造方法,同时对很多高级索引技术的思想有了认识。
索引技术可以理解为对数据查询到一个预先准备。通常,速度越快的索引技术对于数据实体的静态性要求越高,而这些索引建立时所对应的抽象层次相对较高,需要一个比较坚实的数据基础,否则频繁更新实体往往伴随着大规模的表重建操作。
参考文献
《Oracle索引技术》 (美)Darl Kuhn
图源:http://blog.csdn.net/v_JULY_v/article/details/6530142/
B树的定义:https://en.wikipedia.org/wiki/B-tree
位图索引:https://www.cnblogs.com/LBSer/p/3322630.html
分区索引:
http://ctwen.iteye.com/blog/2250320
http://blog.itpub.net/35489/viewspace-616711/
索引组织表:http://blog.csdn.net/ljean/article/details/51360398
反向键索引:http://blog.csdn.net/zq9017197/article/details/7321604
Oracle索引技术研究的更多相关文章
- .NET Core技术研究系列-索引篇
随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...
- 【转】Oracle索引的类型
数据库的应用类型分为 OLTP(OnLine Transaction Processing ,联机事务处理):OLTP是传统关系型数据库的主要应用,其主要面向基本的.日常的事务处理,例如银行交易. O ...
- Atitit 索引技术--位图索引
Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...
- Oracle 索引<七>
Oracle 索引 管理索引-原理介绍 介绍 索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能.索引有很多种我们主要介绍常用的几种: 为什么添加了索 ...
- Indri中的动态文档索引技术
Indri中的动态文档索引技术 戴维 译 摘要: Indri 动态文档索引的实现技术,支持在更新索引的同时处理用户在线查询请求. 文本搜索引擎曾被设计为针对固定的文档集合进行查询,对不少应用来说,这种 ...
- ORACLE 索引概述
索引是数据库中一种可选的数据结构,她通常与表或簇相关.用户可以在表的一列或数列上建立索引,以提高在此表上执行 SQL 语句的性能.就像本文档的索引可以帮助读者快速定位所需信息一样,Oracle 的索引 ...
- 应用索引技术优化SQL 语句(转)
原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- MongoDB进阶之路:不仅仅是技术研究,还有优化和最佳实践--转载
摘要:MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 本文将从操作手册.技术研究.会议分享.场景应用等几个方面给大家推荐干货好文 ...
随机推荐
- C# 通过Exchange server 发送邮件
微软的Exchange邮件服务不同与一般的邮件server,他不能简单使用SmtpClient等组件实现邮件收发的功能. 那么怎么通过Exchange服务发送邮件呢? 微软的Exchange服务都有w ...
- Sql Server-使用Sql Server自带的分词功能实现字段关键词提取(分词能力很低,慎用)
“创建全文索引 启动服务 在SQL Server配置管理工具中,找到'SQL Full-text Filter Daemon Launcher'服务用本地用户启动. 创建全文目录 打开需要创建全文目录 ...
- Spring batch学习 (1)
Spring Batch 批处理框架 埃森哲和Spring Source研发 主要解决批处理数据的问题,包含并行处理,事务处理机制等.具有健壮性 可扩展,和自带的监控功能,并且支持断点和重发.让程序员 ...
- FDStoredProc 存储过程控件 强
//FireDAC FDStoredProc1->StoredProcName = "myReport1"; FDStoredProc1->Prepare(); FDS ...
- nested exception is java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}
Deploying inside Eclipse v3.6 raises the exception. The WEB-INF/classes/ folder in the .war doesn't ...
- JS 位数不够自动左补0
var mycode = "11"; mycode = (Array(4).join(0) + parseInt(mycode)).slice(-4);//0011 mycode1 ...
- C#格式化数字
var t1 = Profiler.GetMonoHeapSize()/div; var t2 = Profiler.GetMonoUsedSize() / div; var t3 = Profile ...
- sass对象的定义
sass在3.3引入map类型,它与JS的对象非常相似,它有两种定义模式.外面都是用小括号括括起来,每个键值对可以像JS那样与逗号分开.不同之后是,键名与键值之间的冒号不是 必须的 不用对象的情况 @ ...
- EL的基本使用
总结:EL操作的是作用域 <body> <% Users users = new Users("lisi","lisi123","l ...
- S 配置邮箱