设为首页 收藏本站
查看: 643|回复: 0

[经验分享] Oracle中的索引详解

[复制链接]

尚未签到

发表于 2018-9-9 09:13:55 | 显示全部楼层 |阅读模式
  一、 ROWID的概念
  存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /,
  row在数据块中的存储方式
  SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20;
  比 如:OOOOOOFFFBBBBBBRRR
  OOOOOO:data object number, 对应dba_objects.data_object_id
  FFF:file#, 对应v$datafile.file#
  BBBBBB:block#
  RRR:row#
  Dbms_rowid包
  SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual;
  具 体到特定的物理文件
  二、 索引的概念
  1、 类似书的目录结构
  2、 Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度
  3、 索引直接指向包含所查询值的行的位置,减少磁盘I/O
  4、 与所索引的表是相互独立的物理结构
  5、 Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引
  6、 语法:CREATE INDEX index ON table (column[, column]...);
  7、 B-tree结构(非bitmap):
  [一]了解索引的工作原理:
  表:emp
DSC0000.jpg

  目标:查询Frank的工资salary
  建立索 引:create index emp_name_idx on emp(name);
DSC0001.jpg

DSC0002.jpg

  [试验]测试索引的作用:
  1. 运行/rdbms/admin/utlxplan 脚本
  2. 建立测试表
  create table t as select * from dba_objects;
  insert into t select * from t;
  create table indextable

  as select rownum>  object_id,data_object_id,object_type,created
  from t;
  3. set autotrace trace explain
  4. set timing on
  5. 分析表,可以得到cost
  6. 查询 object_name=’DBA_INDEXES’
  7. 在object_name列上建立索引
  8. 再查询
  [思考]索引的代价:
  插入,更新
  三、 唯一索引
  1、 何时创建:当某列任意两行的值都不相同
  2、 当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立
  3、 语法:CREATE UNIQUE INDEX index ON table (column);
  4、 演示
  四、 组合索引
  1、 何时创建:当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引
  2、 组合索引中列的顺序是任意的,也无需相邻。但是建议将最频繁访问的列放在列表的最前面
  3、 演示(组合列,单独列)
  五、 位图索引
  1、 何时创建:
  列中有非常多的重复的值时候。例如某列保存了 “性别”信息。
  Where 条件中包含了很多OR操作符。
  较少的update操作,因为要相应的跟新所有的bitmap
  2、 结构:位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。
  3、 优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多
  4、 语法:CREATE BITMAP INDEX index ON table (column[, column]...);
  5、 掩饰:
  create table bitmaptable as select * from indextable where owner in('SYS','PUBLIC');
  分析,查找,建立索引,查找
  六、 基于函数的索引
  1、 何时创建:在WHERE条件语句中包含函数或者表达式时
  2、 函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。
  3、 语法:CREATE INDEX index ON table (FUNCTION(column));
  4、 演示
  必须要分析表,并且 query_rewrite_enabled=TRUE
  或者使用提示/*+ INDEX(ic_index)*/
  七、 反向键索引
  目的:比如索引值是一个自动增长的列:
DSC0003.jpg

  多个用户对集中在少数块上的索引行进行修改,容易引起资源的争用,比如对数据块的等待。此时建立反向索 引。
  性能问题:
  语法:
  重建为标准索引:反之不行
  八、 键压缩索引
  比如表landscp的数据如下:
  site feature job
  Britten Park, Rose Bed 1, Prune
  Britten Park, Rose Bed 1, Mulch
  Britten Park, Rose Bed 1,Spray
  Britten Park, Shrub Bed 1, Mulch
  Britten Park, Shrub Bed 1, Weed
  Britten Park, Shrub Bed 1, Hoe
  ……
  查询时,以上3列均在where条件中同时出现,所以建立基于以上3列的组合索引。但是发现重复值很多,所以考虑压缩特性。
  Create index zip_idx
  on landscp(site, feature, job)
  compress 2;
  将索引项分成前缀(prefix)和后缀(postfix)两部分。前两项被放置到前缀部分。
  Prefix 0: Britten Park, Rose Bed 1
  Prefix 1: Britten Park, Shrub Bed 1
  实际所以的结构为:
  0 Prune
  0 Mulch
  0 Spray
  1 Mulch
  1 Weed
  1 Hoe
  特点:组合索引的前缀部分具 有非选择性时,考虑使用压缩。减少I/O,增加性能。
  九、 索引组织表(IOT)
  将表中的数据按照索 引的结构存储在索引中,提高查询速度。
  牺牲插入更新的性能,换取查询 性能。通常用于数据仓库,提供大量的查询,极少的插入修改工作。
  必须指定主键。插入数据时,会根据主键列进行B树索引排序,写入磁盘。
  十、 分区索引
  簇:
  A cluster is a group of tables that share the same data blocks because they share common columns and are often used together.
DSC0004.jpg

  转载自:http://www.oschina.net/question/30362_4057


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-568520-1-1.html 上篇帖子: Oracle Linux 7.1 安装oracle 12c RAC 下篇帖子: oracle中in 和exists的使用效率
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表