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

[经验分享] SQL调优技巧:统计信息(文末福利)

[复制链接]

尚未签到

发表于 2018-10-19 11:23:19 | 显示全部楼层 |阅读模式
  点击上方“异步社区”,选择“置顶公众号”
  技术干货,第一时间送达
  统计信息类似于战争中的侦察兵,如果情报工作没有做好,打仗就会输掉战争。同样的道理,如果没有正确地收集表的统计信息,或者没有及时地更新表的统计信息,SQL的执行计划就会跑偏,SQL也就会出现性能问题。收集统计信息是为了让优化器选择最佳执行计划,以最少的代价(成本)查询出表中的数据。
  统计信息主要分为表的统计信息、列的统计信息、索引的统计信息、系统的统计信息、数据字典的统计信息以及动态性能视图基表的统计信息。
  关于系统的统计信息、数据字典的统计信息以及动态性能视图基表的统计信息本文不做讨论,本文重点讨论表的统计信息、列的统计信息以及索引的统计信息。
  表的统计信息主要包含表的总行数(num_rows)、表的块数(blocks)以及行平均长度(avg_row_len),我们可以通过查询数据字典DBA_TABLES获取表的统计信息。
  现在我们创建一个测试表T_STATS。
DSC0000.jpg

  我们查看表T_STATS常用的表的统计信息。
DSC0001.jpg

  因为T_STATS是新创建的表,没有收集过统计信息,所以从DBA_TABLES查询数据是空的。
  现在我们来收集表T_STATS的统计信息。
DSC0002.jpg

  我们再次查看表的统计信息。
DSC0003.jpg

  从查询中我们可以看到,表T_STATS一共有72?674行数据,1?061个数据块,平均行长度为97字节。
  列的统计信息主要包含列的基数、列中的空值数量以及列的数据分布情况(直方图)。我们可以通过数据字典DBA_TAB_COL_STATISTICS查看列的统计信息。
  现在我们查看表T_STATS常用的列统计信息。
DSC0004.jpg

  上面查询中,第一个列表示列名字,第二个列表示列的基数,第三个列表示列中NULL值的数量,第四个列表示直方图的桶数,最后一个列表示直方图类型。
  在工作中,我们经常使用下面脚本查看表和列的统计信息。
DSC0005.jpg

  索引的统计信息主要包含索引blevel(索引高度-1)、叶子块的个数(leaf_blocks)以及集群因子(clustering_factor)。我们可以通过数据字典DBA_INDEXES查看索引的统计信息。
  我们在OBJECT_ID列上创建一个索引。
DSC0006.jpg

  创建索引的时候会自动收集索引的统计信息,运行下面脚本查看索引的统计信息。
DSC0007.jpg

  在以后章节中,我们会详细介绍表的统计信息、列的统计信息以及索引的统计信息是如何被应用于成本计算的。
统计信息重要参数设置
  我们通常使用下面脚本收集表和索引的统计信息。
DSC0008.jpg

  ownname表示表的拥有者,不区分大小写。
  tabname表示表名字,不区分大小写。
  granularity表示收集统计信息的粒度,该选项只对分区表生效,默认为AUTO,表示让Oracle根据表的分区类型自己判断如何收集分区表的统计信息。对于该选项,我们一般采用AUTO方式,也就是数据库默认方式,因此,在后面的脚本中,省略该选项。
  estimate_percent 表示采样率,范围是0.000 001~100。
  我们一般对小于1GB的表进行100%采样,因为表很小,即使100%采样速度也比较快。有时候小表有可能数据分布不均衡,如果没有100%采样,可能会导致统计信息不准。因此我们建议对小表100%采样。
  我们一般对表大小在1GB~5GB的表采样50%,对大于5GB的表采样30%。如果表特别大,有几十甚至上百GB,我们建议应该先对表进行分区,然后分别对每个分区收集统计信息。
  一般情况下,为了确保统计信息比较准确,我们建议采样率不要低于30%。
  我们可以使用下面脚本查看表的采样率。
DSC0009.jpg

  从上面查询我们可以看到,对表T_STATS是100%采样的。现在我们将采样率设置为30%。
DSC00010.jpg

  从上面查询我们可以看到采样率为30%,表的总行数被估算为73?067,而实际上表的总行数为72?674。设置采样率30%的时候,一共分析了21?920条数据,表的总行数等于round(21?920*100/30),也就是73?067。
  除非一个表是小表,否则没有必要对一个表100%采样。因为表一直都会进行DML操作,表中的数据始终是变化的。
  method_opt 用于控制收集直方图策略。

  method_opt => 'for all columns>  表示所有列都不收集直方图,如下所示。
DSC00011.jpg

  我们查看直方图信息。
DSC00012.jpg

  从上面查询我们看到,所有列都没有收集直方图。

  method_opt => 'for all columns>  表示对表中所有列收集自动判断是否收集直方图,如下所示。
DSC00013.jpg

  我们查看直方图信息,如下所示。
DSC00014.jpg

  从上面查询我们可以看到,除了OBJECT_ID列和EDITION_NAME列,其余所有列都收集了直方图。因为EDITION_NAME列全是NULL,所以没必要收集直方图。OBJECT_ID列选择性为100%,没必要收集直方图。
  在实际工作中千万不要使用

  method_opt => 'for all columns>  收集直方图信息,因为并不是表中所有的列都会出现在where条件中,对没有出现在where条件中的列收集直方图没有意义。

  method_opt => 'for all columns>  表示对出现在where条件中的列自动判断是否收集直方图。
  现在我们删除表中所有列的直方图。
DSC00015.jpg

  我们执行下面SQL,以便将owner列放入where条件中。
DSC00016.jpg

  接下来我们刷新数据库监控信息。
DSC00017.jpg


  我们使用method_opt => 'for all columns>
DSC00018.jpg

  然后我们查看直方图信息。
DSC00019.jpg

  从上面查询我们可以看到,Oracle自动地对owner列收集了直方图。
  思考,如果将选择性比较高的列放入where条件中,会不会自动收集直方图?现在我们将OBJECT_NAME列放入where条件中。
DSC00020.jpg

  然后我们刷新数据库监控信息。
DSC00021.jpg

  我们收集统计信息。
DSC00022.jpg

  我们查看OBJECT_NAME列是否收集了直方图。
DSC00023.jpg


  从上面查询我们可以看到,OBJECT_NAME列没有收集直方图。由此可见,使用AUTO方式收集直方图很智能。mothod_opt默认的参数就是 for all columns>  本文摘自《SQL优化核心思想》
DSC00024.jpg

  《SQL优化核心思想》
  罗炳森 黄超 钟侥 著
  点击封面购买纸书
  结构化查询语言(Structured Query Language,SQL)是一种功能强大的数据库语言。它基于关系代数运算,功能丰富、语言简洁、使用方便灵活,已成为关系数据库的标准语言。 本书旨在引导读者掌握SQL优化技能,以更好地提升数据库性能。本书基于Oracle进行编写,内容讲解由浅入深,适合各个层次的读者学习。
  本书面向一线工程师、运维工程师、数据库管理员以及系统设计与开发人员,无论是初学者还是有一定基础的读者,都将从中获益。
  小福利
关注【异步社区】服务号,转发本文至朋友圈或 50 人以上微信群,截图发送至异步社区服务号后台,并在文章底下留言你学习SQL语言经验,或者试读本书感受,我们将选出3名读者赠送《SQL优化核心思想》1本,赶快积极参与吧!  活动截止时间:2018年 5月10 日
DSC00025.jpg

  在“异步社区”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!
  扫一扫上方二维码,回复“关注”参与活动!
  阅读原文,购买《SQL优化核心思想》
  阅读原文


运维网声明 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.yunweiku.com/thread-623579-1-1.html 上篇帖子: Ceph Calamari Server RPM编译 下篇帖子: vCenter Server Appliance(VCSA )6.7部署指南
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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