【引言】
本文基于如下文章进行的实验,讲述聚簇因子对SQL索引的影响。

链接如下:
https://www.modb.pro/db/40283

一张表上有索引,sql在执行的时候却不走索引的原因有很多,一张表上的聚簇因子是影响CBO判断索引是否能被使用的一个重要判断依据。

索引范围扫描的成本计算公式如下:
cost = {(blevel+leaf_blocks * effective index selectivity)*(1-optimizer_index_caching/100)+(cluster_factor * effective table selectivity)*(optimizer_index_cost_adj/100)

这两个参数在oracle 10gR2之后建议保持默认值,从上面成本计算公式可看出这两个参数是如何影响成本计算的;还有一个参数在一定程度上也能决定索引的优先程度:db_file_multiblock_read_count。

先来了解下什么是聚簇因子。

聚簇因子(clustering factor)和索引高度(blevel)、叶块数(leaf_blocks)等统计信息值一样用于计算cost的值,以决定当前sql语句是走索引还是走全表扫描。

堆表中数据的存储方式为无序存储,
也就是任意的DML操作都可能使得当前数据块存在可用的空闲空间,出于节省空间的考虑,块上的可用空闲空间会被新插入的行填充,而不是按顺序填充到最后被使用的块上。

以上的操作也就导致了数据块中数据的无序性,而创建索引的时候,会将指定的列按顺序插入索引块中。正是因为表上的数据是无序的,索引上的数据是有序的,这种差异性就可以用聚簇因子来表示。

接下来看看索引聚簇因子(clustering factor)对于索引的使用是如何影响的,通过实验演示一下clustering factor对索引选择的影响。

测试数据准备

create tablespace tbs0831 datafile '/u01/app/oracle/oradata/ces/tbs0831.dbf' size 10M autoextend off;

create user test0831 identified by test0831 default tablespace tbs0831;

grant dba to test0831;

conn test0831/test0831

create table tb0831 (id1 number ,id2 number);

begin     for i in 1..100          loop              for j in 1..100                     loop                     insert into tb0831 values(i,j);                     end loop;          end loop;end;/
create index idx_1 on tb0831(id1);create index idx_2 on tb0831(id2);

==--搜集统计信息,注意加cascade=>true,表示对索引也搜集统计信息==exec dbms_stats.gather_table_stats(user,'TB0831',cascade=>true);

从上面插入数据的脚本可看出,id1的值存储的更加紧凑,id2的值存储的更加松散。

SQL> select INDEX_NAME,NUM_ROWS,DISTINCT_KEYS,CLUSTERING_FACTOR,BLEVEL,LEAF_BLOCKS from dba_indexes where table_name='TB0831';

INDEX_NAME                                                                                   NUM_ROWS DISTINCT_KEYS CLUSTERING_FACTOR     BLEVEL LEAF_BLOCKS------------------------------------------------------------------------------------------ ---------- ------------- ----------------- ---------- -----------IDX_1                                                                                           10000           100                22          1          20IDX_2                                                                                           10000           100              1600          1          20

先执行如下sql:

explain plan for select * from tb0831 where id1=50;select * from table(dbms_xplan.display);

将id1换成id2再执行下面的sql:

explain plan for select * from tb0831 where id2=50;

select * from table(dbms_xplan.display);

正是索引IDX_2的聚簇因子为1600,太大了,导致cbo在评估执行计划的时候,计算出全表扫描的cost要小于走索引idx_t02的cost。所以在有索引的情况下,cbo选择了走全表扫描。

如在一些场景下,ORACLE可能不会自动走索引,如果对业务清晰,可以尝试使用强制索引,测试查询语句的性能。
针对如下SQL进行index绑定:
select * from tb0831 where id2=50;

重写sql:

SQL> explain plan for select /*+index(TB0831,idx_2)*/ * from tb0831 where id2=50;

Explained.

SQL> select * from table(dbms_xplan.display);

上述案例,可看出聚簇因子值的大小对于是否走索引产生的影响。

如有一个索引他的聚簇因子很大,该如何优化呢?

  1. 重建索引并不能改变聚簇因子的大小,因索引是有序的,而导致聚簇因子值大的根本原因在于表上存储的数据太无序,以至于和索引中存储的顺序相差甚远。一个可行方案为定期表重构,将数据先临时存储在中间表中,truncate原始表,然后按照索引存储的顺序填充数据到原始表中。

  2. 尽可能的避免一个具有槽糕clustering factor值的索引,比如索引在创建的时候,应考虑按照经常频繁读取的大范围数据的读取顺序来创建索引。

文章至此。

欢迎关注个人微信公众号“一森咖记”

近期热文

你可能也会对以下话题感兴趣。点击链接便可查看。

  • 为什么不建议把数据库部署在docker容器内?

  • oracle异常恢复(一)dul和bbed的使用

  • Oracle Cloud云端账号的注册过程

  • MySQL基本知识点梳理和查询优化

  • 区块链上的数据库:CovenantSQL

  • MySQL数据延迟跳动的问题分析

  • MySQL 5.6和 5.7_同步账号修改密码方式:真的不一样

  • MySQL8.0 为嘛弃用Query Cache?

  • 你应该知道的分布式系统之奠基石CAP理论

  • MySQL数据延迟跳动的问题分析

  • 如何判断一个应用系统性能好不好?

  • MySQL Document Store 混合使用关系型数据与非关系型数据

  • 分布式一致性算法:Paxos算法学习

  • MySQL 中你不得不知的重要知识点

  • 神技_如何快捷下载Oracle补丁的方法?!

  • 趋势篇:oracle 11g,12c,18c,19c之support lifetime

  • Centos能不能替换RHEL?

  • Centos能不能替换RHEL?

  • 年末总结_聊一聊数据库行业的“继往开来”

  • 【干货篇】在国内外数据库百家争鸣的时代,DBA们该何去何从?

  • 实操:12C RAC环境下的ADG同步库搭建

  • 浅谈MySQL三种锁:全局锁、表锁和行锁

oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响相关推荐

  1. Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  2. mysql oracle 备份数据库备份_完整备份Oracle数据库

    修改备份文件的有效时间(必须用spfile启动数据库)SQLgt; alter system set control_file_record_keep_time=30 scope=both; 修改备份 ...

  3. mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

    冗余索引和未使用索引的危害 随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引.但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上 ...

  4. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  5. Oracle 11g Release 1 (11.1)——简单管理聚簇

    http://docs.oracle.com/cd/B28359_01/server.111/b28310/clustrs.htm#i1006586 本文内容 创建聚簇 变更聚簇 删除聚簇 创建聚簇 ...

  6. access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 这篇我们就来谈谈关于索引方面的mysql面试题.还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎. ps:其实很早就想写了,一直偷懒! 其实这下面每个 ...

  7. mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解

    1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...

  8. db2 删除索引_史上最牛分析MySQL索引机制的实现!不接受反驳!

    作者:陌北有棵树,爱玩Java,架构师社区合伙人! 数据库是一个只要从事后端开发,就永远离不开的技术,大部分企业选择的数据库都是MySQL,所以需要我们对MySQL有着足够的了解. 而MySQL索引, ...

  9. java mysql索引_如何理解并正确使用MySql索引

    1.概述 索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性能,接下来主要介绍在MySql数据库中索引类型,以及如何创建出更加合理且高效的索引技巧. 注:这 ...

最新文章

  1. signature=a8a3e788013f73439051c7287d7f5f0b,来用百度密语吧!!!
  2. word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
  3. 【Clickhouse】Clickhouse 物化视图 MATERIALIZED VIEW
  4. android 字体像素转换工具类_android px,dp,sp大小转换工具
  5. c语言指针章总结,c语言指针的学习心得
  6. 实测解决:在此系统上禁止运行脚本。有关详细信息,请参阅 httpsgo.microsoft.comfwlinkLinkID=135170 中的 about_Execution_Policies。
  7. Linux 命令基本格式
  8. crt 生成pem_如何将.pem转换为.crt和.key?
  9. Visual C++ 6.0的三个问题---尚未完成安装 MSDEV.EXE 应用程序错误 缺少动态链接库文件
  10. 微信小程序入门9-微信开放平台unionId机制介绍
  11. 应用程序错误(0xc0000135)
  12. 从人物的名字看香港电影人的文化底蕴
  13. java 调用webDriver实现访问网页(谷歌浏览器)
  14. Weakly Supervised Instance Segmentation using the Bounding Box Tightness Prior 论文笔记
  15. React:Component组件
  16. 计算机教室网络平面示意图,计算机机房平面布置图.doc
  17. 在局域网下怎样控制另一台电脑
  18. 【文献阅读】SoccerNet: A Scalable Dataset for Action Spotting in Soccer Videos
  19. python 监目录文件变动,然后在做些其它的操作,watchdog 详细解答
  20. Python中的psutil:一个用于获得处理器和系统相关信息的模块

热门文章

  1. linux od命令详解,详细介绍Linux od命令
  2. Currency Exchange
  3. 怎么学好MYSQL的查和改_mysql学习【第3篇】:数据库之增删改查操作
  4. php图像无法显示,php – 无法显示图像,因为它包含错误[图像生成器]
  5. java object 源码_java中Object类 源代码详解
  6. mysql viewlog_Mysql心路历程:两个”log”引发的”血案”
  7. 的garch预测_精品细读|基于隐含波动率、已实现波动率和GARCH模型波动率的预测...
  8. ef 执行mysql语句_在EF中执行SQL语句
  9. strtus中action注入spring bean
  10. CSV格式整理,去除与上一行数据重复的单元格