ITPub博客

首页 > 数据库 > Oracle > 【TUNE_ORACLE】Oracle索引设计思想(四)三星级索引

【TUNE_ORACLE】Oracle索引设计思想(四)三星级索引

原创 Oracle 作者:Attack_on_Jager 时间:2021-03-15 19:01:45 0 删除 编辑

什么是三星级索引

三星级索引是一种能够 同时满足下面三个条件的查询性能较好的索引:

第一颗星:拥有最窄索引片(窄索引,把等值谓词放在索引最前面)

第二颗星:避免排序(出现在关键字“order by”后面的列才能满足第二颗星)

第三颗星:查询语句中所有列都在索引中(宽索引,也是最容易达成的条件,因此优先级最低)

 

三星级索引设计思想

先放例子:

select stu_id,stu_name from students where score between 90 and 100 and class_no=302 order by stu_name;

1. 先满足第三颗星,把谓词全部放到索引中(谓词在索引中的顺序先暂定)

2. 有一个等值谓词“class_no=302”,因此把该谓词放到索引第一个来 尽可能满足第一颗星(现在还达不到第一颗星的效果,只是接近)。此时索引可以是idx1(class_no, stu_name, score,stu_id) 或 idx2(class_no, score, stu_name,stu_id)

3. 为了满足第二颗星,必须把索引中的“stu_name”放在“score”前面(比如上面的索引idx1或者idx3(stu_name,xxx,xxx,xxx))。如果不这样做,就优化器必须先排序,因为索引是按谓词从左到右来自动排序的, 第二颗星就是利用索引自动排序的特性来减少二次排序。但是这样做的后果就是:不满足第一颗星了!因为在满足“class_no=302”条件后,没有先对“score”排序,索引不是最窄索引(第一颗星)。

 

注意

实际情况中, 所有索引都能满足第三颗星,但是要同时满足第一和第二颗星的情况较少,因为绝大部分情况下谓词条件都很复杂,所以大多数情况下只能选择第一颗星或者第二颗星。比如上面的例子,出现了between谓词或者其他范围谓词,所以不能同时拥有第一颗和第二颗星。 大多数情况下,第一颗星比第二颗星重要!

 

最后给出一个三星级索引的创建思想(仅供参考):

首先设计一个索引片尽可能窄(第一颗星)的宽索引(第三颗星)。如果查询语句的索引没有涉及到排序操作(第二颗星),那这个索引就是完美的三星级索引,否则就是二星级索引,可牺牲第二颗星来达到最优性能。如果要避免排序,则可以牺牲第一颗星,保留第二颗星。这两种情况在实际中都有用到,需要大家结合具体案例具体分析与选择。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69992972/viewspace-2762983/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
在某银行任职DBA,拥有多年数据库运维经验,擅长Oracle,MySQL。尤其擅长Oracle的SQL优化,数据库性能调优,数据库备份、恢复与迁移。拥有的认证:OCM 12c,OCM 11g,MySQL OCP,RHCE,阿里云ACP,巨杉SCDP,软考系统集成工程师认证,Oracle Iaas OCA,OBCA,TDSQL认证,TBase认证

注册时间:2021-01-11

  • 博文量
    142
  • 访问量
    482800