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

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

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

相关文章

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求,dp[i]表示:到达i位置,一共有多少种方法 2、状态转移方程 以i位置的状态,以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段(带参数 工具方法) enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后台管理系统模板

Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板&#xff0c;集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技术栈开…

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…

Python格式化字符串的四种方法

Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符&#xff0c;而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出&#xff1a;Hello, World!你可以使用多个占位符 注意&#xff1a;多个变量占位&#xff0c;变量要…

【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图&#xff1a; Redis最主要的用途&#xff0c;三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;redis最常用的场景&#xff09; 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说&#xff0c;通常情况下&#xff1…

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略&#xff1a;以数据为核心的交易思维 在动态交易市场中&#xff0c;如何在波动中捕捉相对确定的趋势&#xff0c;是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析&#xff0c;判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…

React useMemo函数

第一个参数是回调函数&#xff0c;返回计算的结果&#xff0c;第二个参数是依赖项&#xff0c;该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前&#xff0c;我们先来简单了解一下什么是通义灵码 Project Rules&#xff1f; 大家都知道&#xff0c;在使用 AI 代码助手的时候&#xff0c;有时候生成的代码不是自己想要的&#xff0c;或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…

list的设计

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止权限放大&#xff0c;用引用减少拷贝…

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…

即刻启程,踏上W55MH32高性能以太网单片机学习之路!

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…

C++负载均衡远程调用学习之上报功能与存储线程池

目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…