优化01-统计信息

news2025/5/9 17:21:08

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

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

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

相关文章

Unity-Socket通信实例详解

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

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

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

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

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

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

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

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(&…

【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模拟实现消息队列

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

基于 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("文件路径", &变…

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…

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

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