当前位置: 首页 > article >正文

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象(如表、索引、列等)的元数据信息,帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍:

一、统计信息的分类

表统计信息

  • 行数(NUM_ROWS):表的近似行数(可能基于采样)。
  • 块数(BLOCKS):表占用的数据块总数。
  • 空块数(EMPTY_BLOCKS):未被数据占用的块数。
  • 行迁移/链化(ROW_MOVEMENT):标识是否有行因更新操作导致迁移或链化。
  • 平均行长度(AVG_ROW_LEN):表中每行的平均字节数。

索引统计信息

  • 叶子块数(LEAF_BLOCKS):索引的叶子节点块数。
  • 层级(BLEVEL):索引的高度(根节点到叶子节点的层数)。
  • 聚簇因子(CLUSTERING_FACTOR):衡量索引列与表数据物理存储顺序的匹配程度。值越低,索引效率越高。
  • 唯一值数量(DISTINCT_KEYS):索引列的唯一值数量。

列统计信息

  • 唯一值数量(NUM_DISTINCT):列中不同值的数量。
  • 高频值(DENSE_RANK):最常见的值及其出现频率。
  • 空值比例(NUM_NULLS):列中 NULL 值的数量。
  • 直方图(HISTOGRAM):描述列数据分布的详细统计信息(可选)。

直方图(Histogram)

  • 频率直方图(FREQUENCY):记录每个列值的精确出现次数(适用于低基数列)。
  • 高度均衡直方图(HEIGHT BALANCED):将数据划分为相等大小的区间,记录每个区间的行数(适用于高基数列)。
  • 拓扑直方图(TOP-N):仅记录前 N 个高频值(适用于需要快速分析 TOP 值的场景)。

二、统计信息的存储位置

统计信息存储在以下数据字典视图中:

  • 表统计信息DBA_TABLES / USER_TABLES
  • 索引统计信息DBA_INDEXES / USER_INDEXES
  • 列统计信息DBA_TAB_COLUMNS / USER_TAB_COLUMNS
  • 直方图信息DBA_HISTOGRAMS / USER_HISTOGRAMS

三、统计信息的收集方法

自动收集(Auto Optimizer Stats Collection)

  • 机制:Oracle 后台进程 auto optimizer stats collection 定期(默认每小时)收集统计信息。

  • 触发条件:

    • 表的数据变更量超过 10%(通过 DBMS_STATSESTIMATE_PERCENT 计算)。
    • AWR 快照生成时(如果统计信息过期)。
  • 管理命令:

    -- 查看自动作业状态
    SELECT * FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'auto optimizer stats collection';
    -- 禁用自动收集
    EXEC DBMS_AUTO_TASK_ADMIN.DISABLE('auto optimizer stats collection', TRUE, TRUE);
    -- 启用自动收集
    EXEC DBMS_AUTO_TASK_ADMIN.ENABLE('auto optimizer stats collection');
    

手动收集(Manual Collection)

使用 DBMS_STATS 包手动收集统计信息,支持精细控制:

  • 收集整个数据库:

    EXEC DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动选择采样比例degree          => 8,                             -- 并行度cascade         => TRUE                           -- 收集索引和约束统计信息
    );
    
  • 收集特定表:

    EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname        => 'HR',tabname        => 'EMPLOYEES',partname       => 'SALES_Q1',                     -- 分区名称(可选)method_opt     => 'FOR COLUMNS SAL SIZE 254',    -- 对 SAL 列生成直方图degree         => 4,cascade        => TRUE
    );
    
  • 收集索引统计信息:

    EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname => 'HR', indname => 'EMP_IDX');
    

关键参数

  • estimate_percent:采样比例。DBMS_STATS.AUTO_SAMPLE_SIZE 会根据数据量自动调整(推荐使用)。

  • degree:并行度,加速统计信息收集。

  • **

    method_opt
    

    **:控制列统计信息和直方图的生成方式。例如:

    • FOR ALL COLUMNS SIZE AUTO:自动决定是否为列生成直方图。
    • FOR COLUMNS SAL SIZE 254:强制为 SAL 列生成最大桶数的直方图。
  • cascade:是否同时收集索引和约束的统计信息(默认 TRUE)。

四、查看统计信息

表和索引统计信息

-- 查看表统计信息
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, LAST_ANALYZED 
FROM USER_TABLES 
WHERE TABLE_NAME = 'EMPLOYEES';-- 查看索引统计信息
SELECT INDEX_NAME, LEAF_BLOCKS, DISTINCT_KEYS, CLUSTERING_FACTOR, LAST_ANALYZED 
FROM USER_INDEXES 
WHERE INDEX_NAME = 'EMP_IDX';

列统计信息

-- 查看列的唯一值数量和空值比例
SELECT COLUMN_NAME, NUM_DISTINCT, NUM_NULLS, DENSITY 
FROM USER_TAB_COLUMNS 
WHERE TABLE_NAME = 'EMPLOYEES';

直方图信息

-- 查看列的直方图数据
SELECT ENDPOINT_VALUE, ENDPOINT_NUMBER 
FROM USER_HISTOGRAMS 
WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME = 'SALARY';

统计信息的维护策略

4.1最佳实践

  • 定期收集:在业务低峰期手动收集关键表(如频繁更新的表或大表)。
  • 监控AWR报告:通过 Top SQLSegments by DB Time 发现统计信息失效的线索。
  • 避免过度采样:默认的 AUTO_SAMPLE_SIZE 通常足够,除非需要精确分析数据分布。

4.2锁定统计信息

防止自动作业覆盖手动收集的结果:

-- 锁定表的统计信息
EXEC DBMS_STATS.LOCK_TABLE_STATS(ownname => 'HR', tabname => 'EMPLOYEES');
-- 解锁
EXEC DBMS_STATS.UNLOCK_TABLE_STATS(ownname => 'HR', tabname => 'EMPLOYEES');

处理过时统计信息

  • 手动刷新:当表数据变更显著时(如批量插入、删除),立即重新收集统计信息。
  • 使用 DBMS_STATS.LOCK_STATS:防止自动作业干扰手动维护。

六、常见问题与解决方案

统计信息过期导致性能下降

  • 现象:执行计划突然变差,AWR 报告提示 Top SQLTop SQL Text

  • 解决:手动收集相关表的统计信息:

    EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');
    

直方图缺失或不准确

  • 现象:优化器未选择索引扫描,但实际数据分布适合索引。

  • 解决:强制生成直方图

    EXEC DBMS_STATS.GATHER_TABLE_STATS(OPTIONS => 'GATHER AUTO', METHOD_OPT => 'FOR COLUMNS SAL SIZE 254');
    

分区表统计信息未同步

  • 现象:分区表的子分区统计信息未更新。

  • 解决:指定分区名称收集统计信息:

    EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES', partname => 'SALES_Q1');
    

七、高级功能

增量统计信息(Incremental Statistics)

针对分区表,自动合并子分区的统计信息到父分区:

ALTER TABLE employees SET STATISTICS LEVEL INCREMENTAL;

SQL Plan Management (SPM)

结合统计信息捕获和固定执行计划,防止计划回归:

-- 捕获当前执行计划
EXEC DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => 'abc123');

八、示例:完整维护流程

-- 1. 手动收集整个数据库的统计信息(并行度 8,自动采样)
BEGINDBMS_STATS.GATHER_DATABASE_STATS(estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,degree           => 8,cascade          => TRUE);
END;
/-- 2. 验证表统计信息
SELECT TABLE_NAME, NUM_ROWS, LAST_ANALYZED 
FROM USER_TABLES 
WHERE TABLE_NAME = 'EMPLOYEES';-- 3. 为 SAL 列生成直方图
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname        => 'HR',tabname        => 'EMPLOYEES',method_opt     => 'FOR COLUMNS SAL SIZE 254'
);-- 4. 锁定统计信息
EXEC DBMS_STATS.LOCK_TABLE_STATS('HR', 'EMPLOYEES');

九、总结

Oracle 统计信息是优化器高效工作的基石。通过合理配置自动收集、手动维护和监控策略,可以确保数据库始终基于最新、准确的统计信息生成最优执行计划。对于复杂场景(如分区表、高基数列),需结合直方图、增量统计信息等高级功能,进一步提升性能调优的精准度。

相关文章:

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象(如表、索引、列等)的元数据信息,帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍: 一、统计信息的分类 表统…...

Unity-Socket通信实例详解

今天我们来讲解socket通信。 首先我们需要知道什么是socket通信: Socket本质上就是一个个进程之间网络通信的基础,每一个Socket由IP端口组成,熟悉计网的同学应该知道IP主要是应用于IP协议而端口主要应用于TCP协议,这也证明了Sock…...

MATLAB仿真定点数转浮点数(对比VIVADO定点转浮点)

MATLAB仿真定点数转浮点数 定点数可设置位宽,小数位宽;浮点数是单精度浮点数 对比VIVADO定点转浮点 目录 前言 一、定点数 二、浮点数 三、定点数转浮点数 四、函数代码 总结 前言 在FPGA上实现算法时,相比MATLAB实现往往需要更长的开发…...

配置Jupyter Notebook环境及Token认证(Linux服务器)

配置Jupyter Notebook环境及Token认证(Linux服务器) 背景 在Ubuntu 18.04.6 LTS服务器(IP: 39.105.167.2)上,基于虚拟环境pytorch_env,通过Mac终端(SSH)配置Jupyter Notebook环境&…...

【计算机网络】Cookie、Session、Token之间有什么区别?

大家在日常使用浏览器时可能会遇到:是否清理Cookie?这个问题。 那么什么是Cookie呢?与此相关的还有Session、Token这些。这两个又是什么呢? 本文将对这三个进行讲解区分,如果对小伙伴有帮助的话,也请点赞、…...

SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用

SpringCloud中Nacos服务注册中心 LoadBalancer服务负载均衡使用 前言Nacos工作流程nacos安装docker安装window安装 运行nacos微服务集成nacos高级特性1.服务集群配置方法效果图模拟服务实例宕机 2.权重配置3.环境隔离 如何启动集群节点本地启动多个节点方法 LoadBalancer集成L…...

Spring AI 集成 DeepSeek V3 模型开发指南

Spring AI 集成 DeepSeek V3 模型开发指南 前言 在人工智能飞速发展的当下,大语言模型不断推陈出新,DeepSeek AI 推出的开源 DeepSeek V3 模型凭借其卓越的推理和问题解决能力备受瞩目。与此同时,Spring AI 作为一个强大的框架,…...

Apache Doris 使用指南:从入门到生产实践

目录 一、Doris 核心概念 1.1 架构组成 1.2 数据模型 二、Doris 部署方式 2.1 单机部署(测试环境) 2.2 集群部署(生产环境) 三、数据操作指南 3.1 数据库与表管理 3.2 数据导入方式 3.2.1 批量导入 3.2.2 实时导入 3.…...

26届秋招收割offer指南

26届暑期实习已经陆续启动,这也意味着对于26届的同学们来说,“找工作”已经提上了日程。为了帮助大家更好地准备暑期实习和秋招,本期主要从时间线、学习路线、核心知识点及投递几方面给大家介绍,希望能为大家提供一些实用的建议和…...

拷贝多个Excel单元格区域为图片并粘贴到Word

Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...

Kafka消息队列之 【消费者分组】 详解

消费者分组(Consumer Group)是 Kafka 提供的一种强大的消息消费机制,它允许多个消费者协同工作,共同消费一个或多个主题的消息,从而实现高吞吐量、可扩展性和容错性。 基本概念 消费者分组:一组消费者实例的集合,这些消费者实例共同订阅一个或多个主题,并通过分组来协调…...

【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理

本文深入剖析Bluedroid蓝牙协议栈中 SDP(服务发现协议)服务记录的全生命周期管理流程,涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构,揭示各模块间的协作机制,包括线程安全设计、回…...

中国自动驾驶研发解决方案,第一!

4月28日,IDC《中国汽车云市场(2024下半年)跟踪》报告发布,2024下半年中国汽车云市场整体规模达到65.1亿元人民币,同比增长27.4%。IDC认为,自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板,推动云计算在…...

Kubernetes(k8s)学习笔记(四)--入门基本操作

本文通过kubernetes部署tomcat集群,来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题); 3.网络配置正常(否则即使应用发布没问题,浏…...

【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列

统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…...

【基础复习笔记】计算机视觉

目录 一、计算机视觉基础 1. 卷积神经网络原理 2. 目标检测系列 二、算法与模型实现 1. 在PyTorch/TensorFlow中实现自定义损失函数或网络层的步骤是什么? 2. 如何设计一个轻量级模型用于移动端的人脸识别? 3. 描述使用过的一种注意力机制&#…...

基于 GO 语言的 Ebyte 勒索软件——简要分析

一种新的勒索软件变种,采用Go 语言编写,使用ChaCha20进行加密,并使用ECIES进行安全密钥传输,加密用户数据并修改系统壁纸。其开发者EvilByteCode曾开发过多种攻击性安全工具,现已在 GitHub 上公开 EByte 勒索软件。尽管该勒索软件声称仅用于教育目的,但滥用可能会导致严重…...

0基础 | STM32 | STM32F103C8T6开发板 | 项目开发

注:本专题系列基于该开发板进行,会分享源代码 F103C8T6核心板链接: https://pan.baidu.com/s/1EJOlrTcProNQQhdTT_ayUQ 提取码:8c1w 图 STM32F103C8T6开发板 1、黑色制版工艺、漂亮、高品质 2、入门级配置STM32芯片(SEM32F103…...

南京大学OpenHarmony技术俱乐部正式揭牌 仓颉编程语言引领生态创新

2025年4月24日,由OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会与南京大学软件学院共同举办的“南京大学OpenHarmony技术俱乐部成立大会暨基础软件与生态应用论坛”在南京大学仙林校区召开。 大会聚焦国产自主编程语言…...

主场景 工具栏 植物卡牌的渲染

前置知识:使用easyx图形库 1.IMAGE内存变量存储的是一张位图(图像),存储了像素数据(颜色,尺寸等) 2.loadimage(&变量名,"加载的文件路径")表示从文件中加载图像到变量中 3. saveimage("文件路径", &变…...

计算机网络:深入分析三层交换机硬件转发表生成过程

三层交换机的MAC地址转发表生成过程结合了二层交换和三层路由的特性,具体可分为以下步骤: 一、二层MAC地址表学习(基础转发层) 初始状态 交换机启动时,MAC地址表为空,处于学习阶段。 数据帧接收与源MAC学习 当主机A发送数据帧到主机B时,交换机会检查数据帧的源MAC地址。…...

Java三大基本特征之多态

多态(Polymorphism)是面向对象编程(OOP)的三大特性之一(另外两个是 封装 和 继承),它允许 同一个行为具有不同的表现形式。在 Java 中,多态主要通过 方法重写(Override&a…...

OpenCV 基于生物视觉模型的工具------模拟人眼视网膜的生物视觉机制类cv::bioinspired::Retina

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::bioinspired::Retina 是 OpenCV 中用于仿生视觉处理的一个类,它基于生物视觉模型进行图像预处理。该算法特别适用于动态范围调整…...

前端跨域问题怎么在后端解决

目录 简单的解决方法: 添加配置类: 为什么会跨域 1. 什么是源 2. URL结构 3. 同源不同源举🌰 同源例子 不同源例子 4. 浏览器为什么需要同源策略 5. 常规前端请求跨域 简单的解决方法: 添加配置类: packag…...

Python小程序:上班该做点摸鱼的事情

系统提醒 上班会忘记一些自己的事,所以你需要在上班的的时候突然给你弹窗,你就知道要做啥了 源码 这里有一个智能家居项目可以看看(开源) # -*- coding:utf-8 -*- """ 作者:YTQ 日期: 2025年04日29 21:51:24 """ impor…...

企业级AI革命!私有化部署开源大模型:数据安全+自主可控,打造专属智能引擎

AI大模型浪潮席卷全球,但企业面临两大痛点:数据隐私风险高、公有云服务难定制! 如何既享受大模型的强大能力,又能保障核心数据安全?私有化部署开源大模型强势破局——将顶尖AI能力“装进”企业内网,数据0外…...

飞云分仓操盘副图指标操作技术图文分解

如上图,副图指标-飞云分仓操盘指标,指标三条线蓝色“首峰线”,红色“引力1”,青色“引力2”,多头行情时“首峰线”和“引力1”之间显示为红色,“引力1”和“引力2”多头是区间颜色显示为紫色。 如上图图标信…...

基于vueflow可拖拽元素的示例(基于官网示例的单文件示例)

效果图 代码 <template><div style"width: 100%;height: calc(100vh - 84px)"><VueFlow :nodes"nodes" :edges"edges" drop"onDrop" dragover"onDragOver" dragleave"onDragLeave"><div cl…...

【MongoDB篇】MongoDB的副本集操作!

目录 引言第一节&#xff1a;副本集的核心概念&#xff1a;它是什么&#xff1f;为什么需要它&#xff1f;&#x1f914;&#x1f9e0;第二节&#xff1a;副本集的“骨架”&#xff1a;成员与数据同步机制 &#x1f451;&#x1f504;❤️‍&#x1f525;第三节&#xff1a;生死…...

Kubernetes 集群优化实战手册:从零到生产级性能调优

一、硬件资源优化策略 1. 节点选型黄金法则 # 生产环境常见节点规格&#xff08;AWS示例&#xff09; - 常规计算型&#xff1a;m5.xlarge (4vCPU 16GB) - 内存优化型&#xff1a;r5.2xlarge (8vCPU 64GB) - GPU加速型&#xff1a;p3.2xlarge (8vCPU V100 GPU)2. 自动扩缩容…...