小伙伴们,有没有因为统计信息不准,导致了业务卡顿,各种状况频出,这几天在实践和实操的过程中,时不时就需要进行统计信息的收集。同时统计信息收集的动作也是OCM必考内容。

数据库中的数据是地图,统计信息是导航仪,而优化器则是驾驶策略的制定者,CBO依赖统计信息做出最优成本和路径选择。

一、统计信息功能

在Oracle数据库管理中,统计信息收集(Statistics Gathering)是非常非常重要的环节,直接影响着数据库的性能优化和查询效率。

优化查询性能:

数据库优化器使用统计信息来评估执行计划的成本,选择最优的执行路径。可以根据列的分布、表的大小、索引的选择性等信息来决定是全表扫描还是索引扫描。

自动调整执行计划:

统计信息帮助数据库自动调整执行计划。随着数据的变化,统计信息会更新,这可以确保数据库持续使用最优的执行策略。避免因数据分布变化导致的执行计划突变(Plan Flip)

提高查询的准确性:

统计信息提供了关于数据的精确度,这对于估算查询结果的行数非常关键。在执行聚合查询(如COUNT、SUM等)时,准确的统计信息可以确保返回的结果更加准确。

改善成本估算:

数据库优化器通过统计信息来估算各种操作的成本,如扫描行数、连接操作的开销等。这些估算用于选择最佳的查询执行计划。减少不必要的I/O和CPU消耗,降低全表扫描风险

支持分区和物化视图:

对于使用分区表和物化视图的数据库设计,统计信息对于优化器的决策至关重要。分区表的选择性统计可以帮助优化器更有效地决定使用哪个分区。

支持高级功能:

同样支持高级功能,自动SQL调优、数据仓库优化器这些也将依赖于准确的统计信息来提供最佳的性能。

二、收集方式

1. ​自动收集机制
Oracle通过GATHER_STATS_JOB自动任务实现智能收集:
  • 触发条件​:当DBA_TAB_MODIFICATIONS中记录的DML量 > 表行数的10%时标记为陈旧(Stale)
  • 时间窗口​:默认工作日晚10点-早6点及周末全天
  • 优先级策略​:先处理缺失统计信息对象,再处理陈旧度高的对象
--启用命令BEGINDBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation   => NULL,window_name => NULL);
END; 
/
--PL/SQL procedure successfully completed.
--直接用表名和用户名可以做粗略收集,其他按照列等选项收集,需要细化
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('用户名');
EXEC DBMS_STATS.GATHER_TABLE_STATS('用户名', '表名');
2. ​手动收集原则
以下场景需手动干预:
  • ETL作业后​:避免优化器使用陈旧信息
  • 数据分布倾斜​:存在极端值的列需特殊处理
  • 性能敏感对象​:核心业务表结构变更后
  • 导出到导入必要收集统计信息

三、统计信息的要点

下面用SH Schema验证,统计信息直接决定分区表SALES、大表CUSTOMERS的查询效率:
  • ​优化器决策依据​统计信息为CBO提供数据分布特征。举例:
-- 查看SALES表统计信息(关键字段)
SELECT num_rows, blocks, avg_row_len 
FROM dba_tables 
WHERE owner='SH' AND table_name='SALES';
--NUM_ROWS     BLOCKS AVG_ROW_LEN
---------- ---------- -----------0          0           0
若num_rows严重偏离实际值(如因数据迁移未更新),优化器可能错误选择全表扫描而非分区裁剪。
  • ​资源消耗优化​准确的索引统计信息(如CUSTOMERS_PK的聚簇因子)可避免低效索引扫描:
SELECT clustering_factor 
FROM dba_indexes 
WHERE index_name='CUSTOMERS_PK';
--
CLUSTERING_FACTOR
-----------------00

高聚簇因子(接近表块数)表明索引效率低,需结合统计信息调整索引策略。 

四、举例SH Schema的统计信息收集方法

自动收集策略优化

启用增量收集降低分区表开销:

-- 开启SALES表增量统计
EXEC DBMS_STATS.SET_TABLE_PREFS('SH', 'SALES', 'INCREMENTAL', 'TRUE');
--PL/SQL procedure successfully completed.
-- 验证设置
SELECT preference_value 
FROM dba_tab_stat_prefs 
WHERE owner='SH' AND table_name='SALES' AND preference_name='INCREMENTAL';
--效果​:仅收集数据变更的分区。
PREFERENCE_VALUE
--------------------------------------------------------------------------
TRUE
设置用户SH自动收集任务 

 

BEGINDBMS_SCHEDULER.CREATE_JOB (job_name        => 'gather_stats_job',job_type        => 'PLSQL_BLOCK',job_action      => 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(''SH''); END;',start_date      => SYSTIMESTAMP,repeat_interval => 'FREQ=DAILY; INTERVAL=1', -- 例如每天执行一次enabled         => TRUE,comments        => '自动收集统计信息');
END;
/
手动收集关键场景

​1. 直方图精准控制​

对偏斜字段SALES.AMOUNT_SOLD收集等高直方图:

BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname    => 'SH',tabname    => 'SALES',method_opt => 'FOR COLUMNS SIZE 254 AMOUNT_SOLD', -- 254桶数degree     => 4);
END;
/
--
PL/SQL procedure successfully completed.
SYS@FREE>
-- 验证直方图
SELECT column_name, histogram, num_buckets 
FROM dba_tab_cols 
WHERE owner='SH' AND table_name='SALES' AND column_name='AMOUNT_SOLD';
--
COLUMN_NAME    HISTOGRAM       NUM_BUCKETS
______________ ____________ ______________
AMOUNT_SOLD    NONE                      0

判定​:若HISTOGRAM=HEIGHT BALANCED且NUM_BUCKETS>=100,则有效反映数据分布。 

​2. 分区级统计验证​

检测分区SALES_Q4_2001的陈旧状态--提前确认有分区: 

SELECT partition_name, stale_stats, last_analyzed
FROM dba_tab_statistics
WHERE owner='SH' AND table_name='SALES'AND partition_name='SALES_Q4_2024'AND stale_stats='YES'; -- 陈旧状态检测

处理​:若返回记录,需对该分区单独收集: 

--提前检测确认分区
EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','SALES',partname=>'SALES_Q4_2024');

三、可验证监控脚本(举例SH Schema)

准确性验证

对比COSTS表统计行数 vs 实际行数:

WITH actual AS (SELECT /*+ DYNAMIC_SAMPLING(4) */ COUNT(*) actual_rows FROM sh.costs
)
SELECT t.num_rows "统计行数",a.actual_rows "实际行数",ROUND(ABS((t.num_rows - a.actual_rows)/NULLIF(a.actual_rows,0))*100,2) diff_pct
FROM dba_tables t, actual a
WHERE t.owner='SH' AND t.table_name='COSTS'AND ABS(t.num_rows - a.actual_rows) > 10000; -- 差异>1万行告警no rows selected

​阈值建议​:diff_pct > 5% 时需手动刷新统计。

自动任务健康监测

检查自动任务状态及失败历史:

SELECT job_name, enabled, last_start_date,(SELECT COUNT(*) FROM dba_scheduler_job_run_details WHERE job_name='GATHER_STATS_JOB' AND status='FAILED') fail_count
FROM dba_scheduler_jobs 
WHERE job_name='GATHER_STATS_JOB'
UNION ALL
-- 检查SH模式下统计信息锁定
SELECT 'STATS_LOCK', NULL, NULL, COUNT(*)
FROM dba_tab_statistics 
WHERE owner='SH' AND locked='YES';
JOB_NAME      ENABLED    LAST_START_DATE       FAIL_COUNT
_____________ __________ __________________ _____________
STATS_LOCK                                           4890
处理逻辑​:
  • fail_count > 0 → 检查 dba_scheduler_job_log
  • STATS_LOCK > 0 → 使用 DBMS_STATS.UNLOCK_TABLE_STATS 解锁。

四、实操体会

在举例SH Schema中需重点关注:
  1. 分区表增量统计​:降低90%收集开销,尤其对时间分区字段(如SALES.TIME_ID)。
  2. 偏斜字段直方图​:对金额/数量等高基数列(AMOUNT_SOLD、QUANTITY_SOLD)定制桶数。
  3. 混合收集策略​:
  • 自动任务处理日常变更
  • ETL后对SALES/COSTS手动刷新
  • 使用 PENDING STATS 测试:
EXEC DBMS_STATS.SET_TABLE_PREFS('SH','SALES','PUBLISH','FALSE');
--
PL/SQL procedure successfully completed.

TIPS:

  • 通过统计信息收集,可精准验证统计信息对查询优化的实际影响,实现从理论到高效运维的闭环
  • 在进行大量数据加载或数据修改后,及时重新收集统计信息是非常重要的,以确保优化器能基于最新数据做出正确的决策。
  • 在生产环境中,建议定期监控统计信息的准确性和完整性,必要时进行手动或自动的调整和重新收集
  • 过度频繁地收集统计信息可能会影响系统性能,因为这会增加数据库的负载。因此,应根据实际需要平衡收集频率和系统性能。

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

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

相关文章

Linux驱动程序(PWM接口)与超声波测距

一、利用阿里云服务器实现树莓派外网访问(SSH 反向代理) 1. 树莓派端配置 步骤 1:安装 SSH 服务(若未安装) sudo apt-get install openssh-server 步骤 2:创建反向代理连接 -p 22:指定阿里…

Web攻防-XSS跨站文件类型功能逻辑SVGPDFSWFHTMLXMLPMessageLocalStorage

知识点: 1、Web攻防-XSS跨站-文件类型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能逻辑-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件类型触发XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

强大模型通过自我和解进步——Unsupervised Elicitation of Language Models——论文阅读笔记

本周关注的工作是:Unsupervised Elicitation of Language Models 这篇文章通篇体现了这样一件事——香蕉皮大需要香蕉大! 一句话总结 首先注意:这个工作不是面向对齐的,而是写【如何准备】对齐任务的Reward Model需要的数据集的…

Qt—(Qt初识,槽,信号,事件)

一 Qt初识 暂时不写了 我的理解是类似于c#,是一个组件库,不局限是一个组件框架。 二 Qt Core Qt Core 是 Qt 框架的基础模块,提供非 GUI 的核心功能: 核心类:QObject(信号槽机制)、QEvent&…

深度学习——基于卷积神经网络实现食物图像分类【2】(数据增强)

文章目录 引言一、项目概述二、环境准备三、数据预处理3.1 数据增强与标准化3.2 数据集准备 四、自定义数据集类五、构建CNN模型六、训练与评估6.1 训练函数6.2 评估函数6.3 训练流程 七、关键技术与优化八、常见问题与解决九、完整代码十、总结 引言 本文将详细介绍如何使用P…

详细说说分布式Session的几种实现方式

1. 基于客户端存储(Cookie-Based) 原理:将会话数据直接存储在客户端 Cookie 中 实现: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama访问模型,为什么会出现模型胡乱输出,然后过一会儿再访问,就又变成正常的

例子:大模型推理遇到内存不足 1. 场景还原 你在Mac上用Ollama运行如下代码(以Python为例,假设Ollama有API接口): import requestsprompt "请写一首关于夏天的诗。" response requests.post("http:…

简说 Linux 用户组

Linux 用户组 的核心概念、用途和管理方法,尽量简明易懂。 🌟 什么是 Linux 用户组? 在 Linux 系统中: 👉 用户组(group) 是一组用户的集合,用来方便地管理权限。 👉 用…

S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解

1:S32K328的基础信息 S32K328官网介绍 由下图可知,S32K328的最大主频为 240MHz 2:S32K328时钟树配置 2.1 system clock node 节点说明 根据《S32K3xx Reference Manual》资料说明 Table 143 各个 系统时钟节点 的最大频率如下所示&#…

wordpress小语种网站模板

wordpress朝鲜语模板 紫色风格的韩语wordpress主题,适合做韩国、朝鲜的外贸公司官方网站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 绿色的日语wordpress外贸主题,用来搭建日文外贸网站很实用。 https://www.jianzhanpress.co…

网络:Wireshark解析https协议,firefox

文章目录 问题浏览器访问的解决方法python requests问题 现在大部分的网站已经切到https,很多站点即使开了80的端口,最终还是会返回301消息,让客户端转向到https的一个地址。 所以在使用wireshark进行问题分析的时候,解析tls上层的功能,是必不可少的,但是这个安全交换的…

ollama部署开源大模型

1. 技术概述 Spring AI:Spring 官方推出的 AI 框架,简化大模型集成(如文本生成、问答系统),支持多种 LLM 提供商。Olama:开源的本地 LLM 推理引擎,支持量化模型部署,提供 REST API …

Kafka 可靠性保障:消息确认与事务机制(二)

Kafka 事务机制 1. 幂等性与事务的关系 在深入探讨 Kafka 的事务机制之前,先来了解一下幂等性的概念。幂等性,简单来说,就是对接口的多次调用所产生的结果和调用一次是一致的。在 Kafka 中,幂等性主要体现在生产者端&#xff0c…

使用 React.Children.map遍历或修改 children

使用场景: 需要对子组件进行统一处理(如添加 key、包裹额外元素、过滤特定类型等)。 动态修改 children 的 props 或结构。 示例代码:遍历并修改 children import React from react;// 一个组件,给每个子项添加边框…

智能体三阶:LLM→Function Call→MCP

哈喽,我是老刘 老刘是个客户端开发者,目前主要是用Flutter进行开发,从Flutter 1.0开始到现在已经6年多了。 那为啥最近我对MCP和AI这么感兴趣的呢? 一方面是因为作为一个在客户端领域实战多年的程序员,我觉得客户端开发…

flutter的常规特征

前言 Flutter 是由 Google 开发的开源 UI 软件开发工具包,用于构建跨平台的高性能、美观且一致的应用程序。 一、跨平台开发能力 1.多平台支持:Flutter 支持构建 iOS、Android、Web、Windows、macOS 和 Linux 应用,开发者可以使用一套代码库在…

【Git】代码托管服务

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 Git代码托管服务概述Git核心概念主流Git托管平台Git基础配置仓库创建方式Git文件状态管理常用…

Android 网络请求的选择逻辑(Connectivity Modules)

代码分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 许多APN已经弃用,应用层统一用 requestNetwork() 来请求网络。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立与数据库连接(版本问题的解决方案)踩坑总结

1.如何优雅的建立数据库连接 今天使用这个deepseek写代码,主要就是建立数据库的链接,包括这个建库建表啥的都是他整得,我就是负责执行,然后解决这个里面遇到的一些问题; 其实我学习这个C#不过是短短的4天的时间&…

FastAPI的初步学习(Django用户过来的)

我一直以来是Django重度用户。它有清晰的MVC架构模式、多应用组织结构。它内置用户认证、数据库ORM、数据库迁移、管理后台、日志等功能,还有强大的社区支持。再搭配上Django REST framework (DRF) ,开发起来效率极高。主打功能强大、易于使用。 曾经也…