热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

oracle的统计信息优化,《基于Oracle的SQL优化》笔记第五章Oracle里统计信息...

CBO是基于对各种不同执行路径成本的计算,比较并选取成本值最小的执行路径来作为目标SQL的执行计划的;而成本值的计算则是根据目标SQL所涉及的表、索引、

CBO 是基于对各种不同执行路径成本的计算,比较并选取成本值最小的执行路径来作为目标 SQL 的执行计划的;而成本值的计算则是根据目标 SQL 所涉及的表、索引、列等相关对象的统计信息,运用 CBO 固有的成本值计算公式计算出来的。所以,对统计信息的了解成了理解 CBO、理解执行计划的关键。

Oracle 数据库里的统计信息分为六种类型,包含对应的对象的信息,维度不同:

表的统计信息:典型的维度有 记录数、表块(表里的数据块)的数量、平均行长度等。

索引的统计信息:典型的维度有 索引的层级、叶子块的数量、聚族因子等。

列的统计信息:典型的维度有 列的 distinct 值的数量、列的 null 值的数量、列的最小值、列的最大值以及直方图等。

系统统计信息:所在数据库服务器的系统处理能力,包含来 CPU 和 I/O 这两个维度,借助于系统统计信息,Oracle 可以知道目标数据库服务器的实际处理能力。

数据字典统计信息:描述 Oracle 数据库里的数据字典基表(如 TAB$、IND$ 等)数据字典基表上的索引,以及这些数据字典基表的列的详细信息,与普通表、索引、列的统计信息没有本质区别。

内部对象统计信息:描述 Oracle 数据库里的内部表(如 X$ 系列表,其实只是 Oracle 自定义的内存结构)的信息信息,并不占用实际的物理存储空间。

可以用 ANALYZE 命令(只能收集前四种,且不能并行收集)或 DBMS_STATS 包来收集统计信息,

在导入大量数据后应及时收集统计信息后才进行相关的后续业务操作(包括查询和修改),否则可能会由于实际数据量和统计信息里记录的数据量存在巨大差异而导致 CBO 选择错误的执行计划。

在这种情况下踩过坑,第一次在 Oracle 数据库里把现有的业务表转为分区表时,采用的是建立新的表,然后把数据导过去,索引建好,切了表名,应用起来后慢得不得了,一看执行计划,各种全表扫描,哪怕唯一性的索引都所走索引全扫描,就是因为统计信息没有。

聚族因子的含义及重要性

在 Oracle 数据库里,聚族因子所指按照索引键值排序的索引行和存储于对应表中的数据行的存储顺序的相似程度。

Oracle 按照如下方法计算聚族因子的值:

聚族因子的初始值为 1。

Oracle 首先定位到目标索引处于最左边的叶子块。

从最左边的叶子块的第一个索引键值所在的索引行开始顺序扫描,在顺序扫描的过程中,Oracle 会比对当前索引行的 rowid 和它之前的那个索引行的 rowid,

如果这两个 rowid 并不是指向同一个表块(不需要回表),那么 Oracle 就将聚族因子的当前值递增 1 ,否则不变。

重复步骤 3 直至顺序扫描完目标索引所有叶子块里的所有索引行。

扫描完成后,聚族因子的当前值就是索引统计信息中的 CLUSTERING_FACTOR,Oracle 会将其存在数据字典里。

聚族因子低意味着走索引范围扫描后取得目标 rowid 再回表去访问对应表块的数据时,相邻的索引行所对应的 rowid 极有可能处于同一个表块,也就更容易命中缓存。

因此对于索引范围扫描,聚族因子高的比低的需要耗费更多的物理 I/O ,成本更高。

在 Oracle 数据库里,能够降低目标索引的聚族因子的唯一方法就是对表中数据块按照目标索引的索引键值排序后重新存储。但这种方法也可能会增加该表上其他索引的聚族因子的值。

聚族因子值的大小实际上对 CBO 判断是否走相关的索引起着至关重要的作用。

谓词越界 与 直方图

谓词越界是指如果对目标列指定的 where 查询条件不在该列的最大值与最小值之间,CBO 就无法判断出针对该列的查询条件的可选择率,所以只能用一个估算值来作为针对该列的查询条件的可选择率,如果这个估算的可选择率与实际情况严重不符,确实可能导致 CBO 评估出来的 Cardinality 出现严重偏差,进而使 CBO 选错执行计划。

CBO 会默认认为目标列的数据在其最小值 LOW_VALUE 和最大值 HIGHT_VALUE 之间是均匀分布的,并且会按照这个均匀分布原则来计算对目标列施加查询条件后的可选择率以及结果集的 Cardinality,进而据此来计算成本值并选择执行计划。因此,如果值是不均匀分布的,CBO 可能选错执行计划。

如果对目标列收集了直方图(Histogram),则意味着 CBO 不再认为该目标列上的数据是均匀分布的, CBO 会用该目标列上的直方图统计信息来计算对该列施加查询条件后的可选择率和返回结果集的 Cardinality,进而据此计算成本并选择执行计划。

案例:很多业务数据在处理完后会把状态字段 status 从 0 标记为 1,时间越长,状态为 1 的数据就占居了绝大部分,每次查询都是查状态为 0 的数据,因此可以在状态字段上建立索引。查看执行计划时,status 对应的值用占位符或 1 时,看到的执行计划都是全表扫描,但是是 0 时,则是走索引扫描,这就是直方图的作用。

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。



推荐阅读
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • openGauss每日一练:第6天 - 模式的创建、修改与删除
    本篇笔记记录了openGauss数据库中关于模式(Schema)的创建、修改和删除操作。通过这些操作,用户可以更好地管理和控制数据库对象。实验环境为openGauss 2.0.0,并使用由墨天轮提供的线上环境。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 深入解析三大范式与JDBC集成
    本文详细探讨了数据库设计中的三大范式,并结合Java数据库连接(JDBC)技术,讲解如何在实际开发中应用这些概念。通过实例和图表,帮助读者更好地理解范式理论及其在数据操作中的重要性。 ... [详细]
author-avatar
郝蕾雅老_206
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有