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

来源:这里教程网 时间:2026-03-03 16:31:25 作者:

什么是三星级索引三星级索引是一种能够 同时满足下面三个条件的查询性能较好的索引:第一颗星:拥有最窄索引片(窄索引,把等值谓词放在索引最前面)第二颗星:避免排序(出现在关键字“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谓词或者其他范围谓词,所以不能同时拥有第一颗和第二颗星。 大多数情况下,第一颗星比第二颗星重要!  最后给出一个三星级索引的创建思想(仅供参考):首先设计一个索引片尽可能窄(第一颗星)的宽索引(第三颗星)。如果查询语句的索引没有涉及到排序操作(第二颗星),那这个索引就是完美的三星级索引,否则就是二星级索引,可牺牲第二颗星来达到最优性能。如果要避免排序,则可以牺牲第一颗星,保留第二颗星。这两种情况在实际中都有用到,需要大家结合具体案例具体分析与选择。

相关推荐