Oracle里表、索引、列的统计信息

目录

一、表的统计信息

二、索引的统计信息

1、层级(level)

2、聚簇因子的含义及重要性

3、列的统计信息

3.1直方图(histogram)

1)直方图含义

2)直方图类型


一、表的统计信息

        表的统计信息用于描述表的详细信息,包括记录数(num_rows)、表块的数量(blocks)、平均行长度(avg_row_len)等典型维度。这些维度可以通过数据字典表*DBA_TABLES**DBA_TAB_PARTITIONS**DBA_TAB_SUBPARTITIONS*来分别查看表、分区表的分区和分区表的子分区的统计信息。

二、索引的统计信息

        索引的统计信息描述了索引的详细信息,它包含了索引的层级(blevel)、叶子块数量(leaf_blocks)、聚簇因子(clustering_factor)等典型维度。这些维度可以通过数据字典视图DBA_INDEXES、DBA_IND_PARTITIONS和DBA_IND_SUBPARTITIONS来分别查看索引、分区索引的分区、局部分区索引的子分区的统计信息。

1、层级(level)

        层级表示从根节点到叶子块的深度,层级被CBO用于计算访问索引叶子块的成本,层级越大,表示从根节点到叶子块所需要访问的数据块的数量就越多,耗费的i/o就会越多,索引访问的成本就会越大。在数据库里如果需要降低索引的层级,需要rebuild才可以。

2、聚簇因子的含义及重要性

        oracle数据库中,聚簇因子是指按照索引键值排序的索引行和存储于对应表中的数据行的存储顺序的相似程度。oracle数据库按照如下算法计算聚簇因子:

(1)聚簇因子初始值为1.

(2)oracle首先定位到目标索引处于最左边的叶子块。

(3)从最左边叶子块的第一个索引键值所在的索引行开始顺序扫描,在顺序扫描的过程中,        oracle会比较当前索引行的rowid和之前那个索引行的rowid,如果这两个rowid并不是指向同一个表块,那么oracle就将聚簇因子的当前值递增1;如果这两个rowid是指向同一个表块,oracle就不改变聚簇因子的值。oracle在比对rowid时并不会回表去访问相应的表块。

(4)上述的比对过程会持续下去,知道扫描完目标索引的所有索引块的所有索引行。

(5)上述顺序扫描完成后,聚簇因子的当前值就是索引统计信息中的clustering_factor,oracle将其存储在数据字典里。

        由以上的过程可知:聚簇因子高的索引走索引范围扫描时比相同条件下聚簇因子低的索引要耗费更多的物理i/o,所以聚簇因子高的索引走索引范围扫描的成本会比相同条件下聚簇因子低的索引走索引范围扫描的成本高。即聚簇因子越小越好。

        oracle数据库中,能够降低聚簇因子的唯一方法就是对表中数据按照目标索引的索引键值排序后重新存储。

        oracle数据库里,cbo在计算索引范围扫描(index range scan)的成本计算公式入下:

(*)IRS COST=I/O COST+CPU COST

(*)I/O COST=INDEX ACCESS I/O COST+TABLE ACCESS I/O COST

)index access i/o cost=blevel_celt(#leaf_blocksix_sel)

)table access i/o cost=celt(clustering_factorix_sel_with_filters)

        从这个公式可以推断出走索引范围扫描的成本可以近似看作是与聚簇因子成正比。因此,聚簇因子值得大小实际对CBO判断是否走相关索引起着至关重要的作用。

3、列的统计信息

        oracle里列的统计信息用于描述oracle数据库里列的详细信息,包括列的distinct值(num_distinct)、列的null值(num_nulls)得数量、列的最小值(low_value)、列的最大值(high_value)等一些典型维度。可以通过数据字典dba_tab_col_statistics、dba_part_col_statistics和dba_subpart_col_statistics分别查看表、分区表的分区、分区表的子分区的列的统计信息。

(1)列的distinct值(上述数据字典中字段num_distinct表示distinct值数量),cbo用num_distinct值来计算目标列做等值查询时的可选择率。

(2)上述字典中的字段num_nulls存储的就是目标列的null值数量,cbo用num_null值来评估对目标列施加“is null”或“is not null”条件后的返回结果集cardinality。另外cbo还用num_nulls值来调整对有null值得目标列做等值查询时的可选择率selectivity。

        对目标列进行等值查询时可选择率计算公式:selectivity=(1/num_distinct)*((num_rows-num_nulls)/num_rows)

(3)上述字典的列low_value和high_value值就是目标列的最小值和最大值,cbo通过low_value和high_value来计算目标列进行范围查询时可选择率selectivity的值。

        没有直方图,目标列范围查询可选择率计算公式(略)。

3.1直方图(histogram)

1)直方图含义

        在oracle数据库中,CBO会默认认为目标列的数据在最小值low_value和最大值high_value之间是均匀分布的,并且会根据这个均匀分布的原则来计算对目标列施加查询条件后的可选择率以及结果集的cardinality,进而据此来计算成本值并且选择执行计划。但是目标列的数据是均匀分布的这个原则并不总是准确的,在实际的系统中,我们很容易看到一些目标列的数据分布式不均匀的,甚至是极度倾斜的,分布极不均匀。对这样的列如果还按照均匀分布的原则去计算可选择率和结果集,并据此来计算成本,选择执行计划,那么CBO所选择的执行计划就可能是不合理的,甚至是错误的。

        对于上述问题,oracle引入了直方图。直方图是一种特殊的列的统计信息,它描述了目标列的数据分布情况。可以通过数据字典视图DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS和DBA_SUBPART_HISTOGRAMS来分别查看表、分区表的分区和分区表的子分区的直方图统计信息。

        如果对目标列收集了直方图,则意味着CBO将不再认为该列上的数据是分布不均匀的,CBO就会用该目标列上的直方图统计信息来计算对该列施加查询条件后的可选择率和返回的结果集的cardinility,进而据此计算成本并选择相应的执行计划。即直方图就是oracle为了专门准确评估这种目标列分布不均匀的可选择率和结果集cardinility的方法。

2)直方图类型

        oracle数据库里的直方图使用了一种称为bucket的方式来描述目标列的数据分布。根据bucket的数量,直方图分为2类:

(1)frequency类型直方图:存储在数据字典里用于描述目标列直方图的bucket数量等于目标列的distinct数量。

        oracle直方图针对于文本类型的列收集直方图统计信息,则oracle只会将该文本字段头32位字符取出来,并将其转换成一个浮点数。然后将这个浮点数作为直方图统计信息存储在数据字典里。

(2)heigh balanced类型直方图:存储在数据字典里用于描述目标列直方图的bucket数量小于目标列的distinct数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【保姆级教程】YOLOv8目标检测:训练自己的数据集

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址: https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、数据准备 2.1 安装labelme标注软件 pip install label…

React系列 之 React进阶 含源码解读 (一)事件合成、state原理

资料来源:掘金课程 https://juejin.cn/book/6945998773818490884?enter_fromcourse_center&utm_sourcecourse_center 记录一些笔记 事件合成 React的事件其实是React重新实现的一套事件系统。目标是统一管理事件,提供一种跨浏览器一致性的事件处…

langchain4j DefaultAiServices源码解析

版本 0.28.0 源码 使用langchain4j,可以通过AiServices来封装聊天模型API,实现会话记忆,工具调用,搜索增强,内容审查等功能,并提供简单灵活的用户接口 DefaultAiServices是其默认实现类型,通…

5G智能网关助力工业铸造设备监测升级

随着物联网技术的迅猛发展和工业4.0浪潮的推进,传统工业正面临着严峻的转型升级压力。在这一背景下,铸造行业——这一典型的传统重工业领域,也必须积极探索借助5G、物联网、边缘计算等技术提升生产经营效率的新路径。 本文就基于佰马合作伙伴…

【技巧】ChatGPT Prompt 提示语大全

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 主要来自:https://github.com/f/awesome-chatgpt-prompts ChatGPT SEO提示 Contributed by: StoryChief AI Reference: 7 Powerful ChatGPT Prompts to Create SEO Content Faster 供稿人:…

MyBatis Plus笔记

1、删除 物理删除:从硬盘上直接删除掉 。好处:数据条数少了,不好的地方在于可能会影响到基于这条数据产生的记录 逻辑删除:假删除 两个区别: 删除时 之前:DELETE from sys_user …

链表oj测试题(上)

链表的申明: struct ListNode {int val;struct ListNode* next; }; 1.题1 删除指定元素 例如:链表1 2 6 3 4 5 6,然后选择删除元素6,返回的链表为1 2 3 4 5 。 代码演示: typedef struct ListNode ListNode;List…

Spark与flink计算引擎工作原理

Spark是大批量分布式计算引擎框架,scale语言开发的,核心技术是弹性分布式数据集(RDD)可以快速在内存中对数据集进行多次迭代,支持复杂的数据挖掘算法及图形计算算法,spark与Hadoop区别主要是spark多个作业之…

什么是行业垂直类媒体?有哪些?怎么邀约

传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 行业垂直类媒体是聚焦于特定行业或领域的媒体平台。 行业垂直类媒体不同于主流媒体,它们专注于提供与某个特定领域相关的深入内容和服务,例如商业新闻、旅游、数字…

能拍英语的搜题软件?九个免费好用的大学生搜题工具 #经验分享#知识分享#其他

积极参加社团活动和实践项目,可以帮助大学生拓宽人脉圈和锻炼实际操作能力。 1.粉鹿搜题 这是一个公众号 搜题拥有非常强大的题库,包含IT认证、建筑工程:、会计资格、教师资格、研究生、公务员等类型的题目。 下方附上一些测试的试题及答案 1、BPR基…

面试算法-79-搜索旋转排序数组

题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1…

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)

Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字&#xff1a; Qt、 unique、 单一、 QSharedMemory、 共享内存 摘要 今天接着在公司搞我的屎山代码&#xff0c;按照…

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

文章目录 前期准备&#xff1a;注册高德开发者并创建 key登录控制台创建 key获取 key 和密钥 创建项目创建JS API Loader配置权限创建定义创建模型创建地图组件创建交互逻辑 项目地址 地图组件在手机App中常用地理相关业务&#xff0c;如查看线下门店&#xff0c;设置导航&…

LeetCode 热题 100 | 堆(二)

目录 1 什么是优先队列 1.1 优先队列与堆的关系 1.2 如何定义优先队列 1.3 如何使用优先队列 1.4 如何设置排序规则 2 347. 前 K 个高频元素 2.1 第 2 步的具体实现 2.2 举例说明 2.3 完整代码 3 215. 数组中的第 K 个最大元素 - v2 菜鸟做题&#xff0c;语…

Shell学习

一、 变量 shell是弱类型语言&#xff0c;不用定义数据类型&#xff0c;默认都是字符串。 变量与值之间不得有空格 只能包含数字、字母、下划线 不能以数字开头 区分大小写 根据变量的作用域可以将shell变量分为&#xff1a;全局变量、局部变量、环境变量。全局变量通常和…

app自动化测试怎么学?

app测试的主要内容有那些 1、功能测试 : 查看功能是否正常&#xff0c;主要针对每一个功能点进行一一测试&#xff0c;主要核心就是把验证的每个测试点都满足需求的对应功能&#xff0c;验证标准就是让预期结果和实际结果保持一致。 2、安装卸载测试&#xff1a;首先要测试的…

【Linux】从零认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

深度解析深度学习中的长短期记忆网络(LSTM)(含代码实现)

在深度学习中&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;是一种强大的循环神经网络结构&#xff0c;能够更好地处理长序列数据并减轻梯度消失的问题。本文将介绍LSTM的工作原理&#xff0c;并使用PyTorch实现一个简单的LSTM模型来展示其在自然语言处理中的应用。 …

MongoDB完全开发手册(一篇学会MongoDB所有知识点)

目录 一、MongoDB 基础 1.1 、MongoDB 是什么&#xff1f; 1.2、 MongoDB 的存储结构是什么&#xff1f; 1.3 、文档 1.4 、集合 1.5 、数据库 1.6、 MongoDB 有什么特点&#xff1f; 1.7、 MongoDB 适合什么应用场景&#xff1f; 二、MongoDB 存储引擎 2.1 、MongoDB…

Autosar Crypto Interface学习笔记

文章目录 前言Functional specificationError classificationError detection API specificationType DefinitionsFunction definitionsGeneral APICryIf_InitCryIf_GetVersionInfo Job Processing InterfaceCryIf_ProcessJobDispatch Key IDs匹配KeyId Job Cancellation Inter…