前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3.X vs 4.X:OceanBase 手动收集统计信息的天壤之别!

3.X vs 4.X:OceanBase 手动收集统计信息的天壤之别!

作者头像
爱可生开源社区
发布于 2025-05-08 08:59:47
发布于 2025-05-08 08:59:47
10500
代码可运行
举报
运行总次数:0
代码可运行

作者:何文超,分享 MySQL 和 OceanBase 相关技术博文。 个人博客【CSDN | 雅俗数据库

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1200 字,预计阅读需要 5 分钟。


定档!2025 OceanBase 开发者大会,5 月 17 日广州见!

图片
图片

1. 手动收集统计信息的差异

1.1 不同版本在命令支持上的差异

如果需要显示收集某个表的统计信息,当前主流提供了两种方式来进行统计信息收集,分别是通过 DBMS_STATS 系统包和 ANALYZE 命令。

版本

MySQL 模式

Oracle 模式

3.X

仅支持 ANALYZE 命令方式

支持 DBMS_STATS 包和 ANALYZE 命令

4.X

支持 DBMS_STATS 包和 ANALYZE 命令

支持 DBMS_STATS 包和 ANALYZE 命令

Oracle 模式
  • 推荐使用 DBMS_STATS 系统包进行手动收集统计信息。
  • 原因是 DBMS_STATS 提供了更精细的控制,比如可以收集表级、Schema 级别的统计信息,还能设置不同的粒度、并行度等参数(如设置 degree 控制并行度、granularity 控制粒度等),能满足更复杂的业务场景需求。
MySQL 模式
  • 3.x 版本推荐使用 ANALYZE 命令进行手动收集统计信息。
  • 因为 3.x 版本的 MySQL 模式下不支持 DBMS_STATS 包收集统计信息,若要使用类似 Oracle 模式的功能,需开启 enable_sql_extension 系统变量,但开启后也并非完全等同于 Oracle 模式的功能,且存在一定风险,不建议常规使用。

1.2 不同版本下每日合并操作在收集统计信息上的差异

版本

统计信息收集方式

优势与不足

3.X

在每日合并时,系统自动收集统计信息

优势:自动化完成统计信息收集,操作便捷。不足:每日合并为增量合并,统计信息难以持续精准;无法收集直方图信息,应对数据倾斜场景时缺乏有效手段。

4.X

将统计信息收集与每日合并进行解耦,每日合并期间不再负责收集统计信息

优势:优化架构设计,为解决之前统计信息收集的缺陷创造条件。不足:有望提升统计信息准确性,更好地适应复杂数据场景。

2. DBMS_STATS 方式

注意:对于 OceanBase 3.x 的 MySQL 租户模式,不推荐使用 DBMS_STATS 方式收集统计信息。

2.1 表级统计信息收集

2.1.1 非分区表的统计信息收集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 当表的数据量和列的个数较少(小于 1 千万条)
call dbms_stats.gather_table_stats('test', 't1');

-- 当表的数据量和列的个数较多(大于 1 千万条)
call dbms_stats.gather_table_stats(
    'test',
    't1',
    degree=>8);
2.1.2 分区表的统计信息收集

针对分区表收集统计信息时,可以增加收集的粒度和选择分区的方式来进行更精准的统计信息收集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 增加收集的粒度和选择分区的方式
call dbms_stats.gather_table_stats(
    'test',
    't_part',
    degree=>2,
    granularity=>'APPROX_GLOBAL AND PARTITION');

2.2 schema 级别的统计信息收集

除了对单个表进行统计信息收集,还可以对整个 schema 下的对象进行统计信息收集。这在批量处理多个相关表的统计信息时非常有用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--TEST schema下所有对象收集统计信息
call dbms_stats.gather_schema_stats('TEST');

--TEST schema下所有对象收集统计信息,并设置并行度为 16
call dbms_stats.gather_schema_stats('TEST', degree=>'16');

--TEST schema 下 big_table 表收集统计信息,设置并行度为 128,指定列统计信息的粒度为1
call dbms_stats.gather_table_stats(
    'test',
    'big_table',
    degree=>128,
    method_opt=>'for all columns size 1');

-- 锁定 test schema 下 big_table 表的统计信息
call dbms_stats.lock_table_stats('test','big_table');

-- 再次对 TEST schema下所有对象收集统计信息,设置并行度为 16,指定列统计信息的粒度为 1
call dbms_stats.gather_schema_stats(
    'TEST',
    degree=>'16',
    method_opt=>'for all columns size 1');

-- 解锁 test schema 下 big_table 表的统计信息
call dbms_stats.unlock_table_stats('test','big_table');

3. ANALYZE 方式

注意:对于 OceanBase 3.x 的 MySQL 租户模式,推荐使用 ANALYZE 方式收集统计信息。

3.1 MySQL 模式下 ANALYZE 语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- MySQL 模式下 ANALYZE 语句用法
ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name_list WITH INTNUM BUCKETS

-- 示例如下
ANALYZE TABLE sbtest1 UPDATE HISTOGRAM ON id,k,c,pad WITH 30 BUCKETS;

在 MySQL 模式下,如果不想显式写出全部字段,可以通过 FOR ALL COLUMNS 子句来收集表中所有列的统计信息。

但需要注意的是, FOR ALL COLUMNS 是 Oracle 模式下的语法,因此需要先启用 enable_sql_extension 系统变量以支持 Oracle 模式的扩展语法。

以下是具体的命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER SYSTEM SET enable_sql_extension = TRUE;
ANALYZE TABLE products COMPUTE STATISTICS FOR ALL COLUMNS SIZE 30;

4、统计信息的检查

SQL 适用于 OceanBase 4.2 及更高版本。

MySQL 模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select distinct DATABASE_NAME, TABLE_NAME
    from oceanbase.DBA_OB_TABLE_STAT_STALE_INFO
    where DATABASE_NAME not in('oceanbase','mysql', '__recyclebin')
        and (IS_STALE = 'YES' or LAST_ANALYZED_TIME is null);
Oracle 模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select distinct OWNER, TABLE_NAME
    from sys.DBA_OB_TABLE_STAT_STALE_INFO
    where OWNER != 'oceanbase'
        and OWNER != '__recyclebin' and (IS_STALE = 'YES' or LAST_ANALYZED_TIME is null);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
飞书开放平台-发送文本&富文本消息
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/08
1.9K0
飞书开放平台-发送文本&富文本消息
最近爆火的MCP究竟有多大魅力?MCP开发初体验|得物技术
MCP 全称 Model Context Protocol,是由 Anthropic 公司在 2024 年 11 月推出一个开放协议,主要用于标准化应用程序向大语言模型提供上下文的方式。可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化方式。
得物技术
2025/05/08
1900
最近爆火的MCP究竟有多大魅力?MCP开发初体验|得物技术
飞书开放平台-全新消息卡片搭建工具
前言 你还在为需要手撕 JSON 代码而烦恼吗?消息卡片搭建工具全新升级,为你带来更优雅的卡片创作体验: 🌟 卡片编辑:纯可视化操作编辑消息卡片,再也不用碰代码 🌟 我的卡片:一键保存卡片,轻松构建你的专属卡片模板库 🌟 模板消息:无需烦恼冗长的请求体,一个卡片 ID 就能发送 可视化编辑工具 image.png 如上图卡片上每个元素,都提供了可视化的边界功能。 卡片格式与数据分离 image.png 如上每个卡片都有一个ID,我们称之为卡片模板的ID,另外卡片上每个元素都可以绑定一个变量,通
加多
2023/01/07
2.1K1
飞书开放平台-全新消息卡片搭建工具
飞书开放平台-批量发送消息示例
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/03/19
1.2K0
飞书开放平台-发送卡片消息
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/10
2K0
飞书开放平台-发送卡片消息
飞书开放平台-回复消息示例
本文我们基于飞书开平提供的go-sdk进行展示,go-sdk的github地址为: https://github.com/larksuite/oapi-sdk-go
加多
2023/01/12
1.3K0
飞书开放平台-回复消息示例
聊聊Spring AI Alibaba的FeiShuDocumentReader
本文主要研究一下Spring AI Alibaba的FeiShuDocumentReader
code4it
2025/04/20
610
聊聊Spring AI Alibaba的FeiShuDocumentReader
go调用第三方API通用做法
在最近本人需要调用一些第三方服务,可是有些第三方服务并没有实现Go的官方SDK调用方法,本文将以一个实战案例教会你如何调用99%的第三方api
陈杪秋
2024/07/13
2260
prometheus实战之五:飞书通知告警
程序员欣宸
2023/05/27
4.2K0
prometheus实战之五:飞书通知告警
SCF+腾讯云API+企业微信机器人实现CDB慢查询提醒
CDB数据库在腾讯云控制台可以看到每个数据库示例的操作日志。
树根
2019/01/26
4.6K4
SCF+腾讯云API+企业微信机器人实现CDB慢查询提醒
Go实现海量日志收集系统
完整代码地址为: https://github.com/pythonsite/logagent
肉眼品世界
2021/01/25
1.3K0
Go实现海量日志收集系统
Go使用Curl推送钉钉消息
最近在用Go实现业务日志实时监控,当捕捉到error级别的日志时,想要推送钉钉消息到群里进行通知,下面代码实现了简单消息及markdown消息推送到钉钉机器人webhook的操作,供大家参考。
Clive
2019/05/31
1.3K0
V3手动鉴权失败之Go篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/11/16
1.2K0
V3手动鉴权失败之Go篇
Go实现海量日志收集系统(四)
到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSearch,并且最终通过kiban
coders
2018/05/28
1.5K0
【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
可以看见,时间戳1589629920对应2020-5-16 19:52;这一分钟的网卡流量是103.345Mbps
ahfuzhang
2022/02/22
8110
【get√】golang中实现从腾讯云CVM查询网卡流量的两种方法
golang源码分析:分布式链路追踪
在上一节搭完分布式追踪的采集展示链路后,这一节开始分析分析分布式链路追踪的核心源码。我们知道分布式追踪的原理是通过traceId串联调用链路上的所有服务和日志,每个服务都有一个自己的spanId,每一次rpc调用都需要生成一个子spanId,通过父子spanID的对应关系,构建一个有向无环图实现分布式追踪的。因此在业务代码的接入过程中需要实现如下功能,父子span关系的构建,父子span关系的传递(包括context内部传递和rpc服务之间的传递有可能跨协议比如http和grpc协议之间传递),rpc日志的采样,上报等等。每一个厂商都有自己的实现,opentrace定义了统一的标准接口,我们按照标准实现即可。在业务代码中实现包括四步:
golangLeetcode
2022/12/17
8240
golang源码分析:分布式链路追踪
如何开发ChatOps
现在各种Ops,比如DevOps,AIOps,ChatOps,NoOps等等,反正其背后的意义就是各种卷运维,让运维无路可走。
没有故事的陈师傅
2022/12/06
5550
如何开发ChatOps
8.Go编程快速入门学习
[TOC] 0x00 Go语言基础之Socket网络编程 现在的我们几乎每天都在使用互联网,但是你知道程序是如果通过网络互相通信吗? 描述: 相信大部分人通常是一知半解的,作为一个程序员👨‍💻‍,对于网络模型你应该了解,知道网络到底是怎么进行通信的,进行工作的,为什么服务器能够接收到请求,做出响应。这里面的原理应该是每个 Web 程序员应该了解的。 本章我们就一起来学习下Go语言中的网络编程,关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。 1.基础概念介绍
全栈工程师修炼指南
2022/09/29
7960
8.Go编程快速入门学习
如何优雅的设计一个SDK
相信很多开发同学一定都听说过SDK,SDK全称Software Development Kit,即软件开发工具包。它是由硬件平台、操作系统或编程语言的制造商提供的一套工具,协助软件开发人员面向特定的平台、系统或编程语言创建应用。SDK经常被用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。
闫同学
2023/11/18
1.7K1
Golang包——net
请求http://localhost:8080/hello会打印hello world
羊羽shine
2019/05/29
4750
相关推荐
飞书开放平台-发送文本&富文本消息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验