最佳实践:解读GaussDB(DWS) 统计信息自动收集方案

news/2024/11/19 23:26:15/文章来源:https://www.cnblogs.com/huaweiyun/p/18347040
摘要:现在商用优化器大多都是基于统计信息进行查询代价评估,因此统计信息是否实时且准确对查询影响很大,特别是分布式数据库场景。本文详细介绍GaussDB(DWS)如何实现了一种轻量、实时、准确的统计信息自动收集方案。

本文分享自华为云社区《【最佳实践】GaussDB(DWS) 统计信息自动收集方案》,作者: leapdb。

一、统计信息收集痛点

  1. 何时做analyze,多做空耗系统资源,少做统计信息不及时。
  2. 多个数据源并发加工一张表,手动analyze不能并发。
  3. 数据修改后立即查询,统计信息实时性要求高。
  4. 需要关心每张表的数据变化和治理,消耗大量人力。

二、基本功能介绍

三、自动收集方案

GaussDB(DWS) 支持统计信息自动收集功能,主要解决统计信息收集不及时和不准确的问题。

手动采样:用户在作业中,手动发起的显示analyze。

轮询采样:autovacuum后台线程,轮询发起的analyze。

动态采样:查询时,优化器触发的runtime analyze。

前台动态采样:负责统计信息实时准确,信息放内存(有淘汰机制),一级锁(像查询一样轻量)。

autoanalyze=on;
autoanalyze_mode='light';

后台轮询采样:负责统计信息的持久化,写系统表(四级锁),不要求特别及时。

autovacuum_mode=mix或analyze;
--- 以前只有“后台轮询采样”,都由后台autovacuum线程控制做vacuum或analyze。
--- 后来开发“前台动态采样”,叫autoanalyze。
--- 请注意二者的区别。

二者都需要开启。

替代场景

统计信息基于收集时表数据生成,数据变化较多后可能失效。自动触发也是基于阈值(50+表大小*10%)。

总结:

  1. 小表变化<10%且数据特征变化明显,需要“调低阈值自动收集”。
  2. 调整过采样大小且实时性要求高的场景,需要“主动收集统计信息”。
  3. 外表和冷热表因访问性能问题,不支持自动,需要“主动收集统计信息”。

四、如何保证及时触发

【触发条件】“无统计信息” or “表的修改量超过一定阈值(默认“50 + 表大小 * 10%”)”

【触发场景】含stream计划的SQL都可触发动态采样,包括select和带条件的delete, update。

【修改计数】

1. 哪些修改行为会被记录?

DML: Insert, Update, Delete, Copy, Merge,会累加修改计数。

DDL: truncate table,truncate/exchange/drop partition, alter column type, alter distribute,由于CN无法获取DN修改计数,所以直接记录一个超大修改计数。

2. 跨CN查询场景,如何确保修改计数全局一致?

异步广播:autovacuum后台线程轮询检查时,向所有CN广播全局修改计数。修改计数达2/3时广播一次,此后每增10%再广播一次。

实时广播:单SQL修改超过tuple_change_sync_threshold(默认1W)条时,直接实时广播修改计数到其它CN。

总结:“修改计数记录”和“修改计数广播”,覆盖都比较全面,能够保证查询及时触发动态采样。

五、最佳实践

GaussDB(DWS) analyze使用指南8.1.3及以下版本

GaussDB(DWS) analyze使用指南8.2.0及以上版本

1.事务块中手动analyze堵塞其它业务

【业务场景】

BEGIN;
ANALYZE t_ucuser;
INSERT INTO t_user_name(project_id, account_id, name_id, uid, etl_time)
with t1 AS (
select project_id, account_id, name_id
from t_user_name
WHERE uid is null or uid = ''
)
select a.project_id,a.account_id,a.name_id, b.user_name AS uid, CURRENT_TIMESTAMP AS etl_time
from t1 a join t_ucuser b ON a.project_id = b.project_id AND a.account_id = b.account_id
ON CONFLICT(project_id,account_id,name_id) DO UPDATE
SET project_id=excluded.project_id, account_id=excluded.account_id, name_id=excluded.name_id, uid=excluded.uid, etl_time=excluded.etl_time;
END;

【问题根因】

a. 某数据湖用户,多个数据源按照不同的分区进行数据导入加工。

b. 事务块中有手动analyze,且事务块中后面的查询长时间执行不完。

c. 因analyze对表加四级锁长时间不能释放,导致其它相关表上的业务等锁超时报错。

【解决方案】开启light动态采样,去掉事务块中的手动analyze。

2. 多数据源并发加工同一张表的不同分区

【业务场景】

为了保证用户查询表总有数据,需要把加工过程放到一个事务里面。堵塞其它人的动态采样。

begin;
alter table tab_partition truncate partition P2023_03;
insert into tab_partition select * from t1;
end;

【问题根因】alter table truncate parition对分区加8级锁,事务过程中长时间持锁。

【解决方案】使用exchange partition

CREATE TABLE IF NOT EXISTS tab_tmp1(like tab_partition INCLUDING DROPCOLUMNS INCLUDING DISTRIBUTION INCLUDING STORAGE INCLUDING RELOPTIONS);
INSERT INTO tab_tmp1 SELECT * FROM t1;
ALTER TABLE tab_partition exchange partition (P2023_03) WITH TABLE tab_tmp1;

3.多表并发反序analyze导致统计信息收集失败

【业务场景】

a. 某银行客户,多个表进行批处理数据加工,开启了normal类型动态采样。

b. 查询A先对t1表触发动态采样,再对t2表触发动态采样。

c. 查询B先对t2表触发动态采样,再对t1表触发动态采样。

d. 触发动态采样的顺序不一致,互相申请四级锁导致申锁超时,统计信息未收集。

【问题根因】多人同时按不同顺序analyze多表导致死锁。

【解决方案】开启light动态采样,仅加一级锁不再有四级锁冲突。

4.刚导入的数据不在统计信息中导致查询计划差

【业务场景】

a. 某财经用户,按照月度视为会计期,月初时导入少量数据,然后马上查询。

b. 触发了动态采样,但采集不到最新会计期的少量数据。

【问题根因】新插入数据占比小,及时触发了动态采样但采集不到,导致估算偏差大。

【解决方案】

a. 开启统计信息推算enable_extrapolation_stats功能,根据上一个会计期的统计信息推算当前会计期数据特征。

b. 不提高采样大小,利用历史信息增强统计信息准确性。

5.随机函数质量差导致数据特征统计不准

【业务场景】

a. 某银行客户,按月度条件进行关联查询

b. 多次analyze,最多数据月份在MCV中占比从13%~30%大幅波动

c. 详细输出样本点位置和采样随机数发现,随机数(小数点后6位)生成重复度高导致采样扎堆儿严重。

【问题根因】采样随机数不够随机,样本采集不均匀导致MCV数据特征统计偏差。

【解决方案】

a. 每次传入随机种子再生成随机数,提高随机性和并发能力。控制参数random_function_version。

b. 不提高采样大小,提升随机数质量增强统计信息准确性。

6.样本分布不均匀导致数据特征统计不准

【业务场景】

a. tpc-h的lineitem表l_orderkey列,数据每4~8条批量重复。即同一个订单购买多个商品。

b. 传统采样算法由于采样不均匀,采集到的重复数据稍多,导致采集的distinct值偏低。

【问题根因】数据特征分布不均匀,采样无法抓准数据特征,distinct值高的场景统计出的distinct值偏低。

【解决方案】

a. 使用自研的优化蓄水池采样算法,控制参数analyze_sample_mode=2,让采样更加均匀,以提升统计信息准确性。

b. 如果上述方法没有达到预期效果,可以手动修改distinct值。

select APPROX_COUNT_DISTINCT(l_orderkey) from lineitem; --近似计算distinct值
alter table lineitem alter l_orderkey set (n_distinct=10000); --手动设置distinct值,然后再analyze即可。

 

点击关注,第一时间了解华为云新鲜技术~

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

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

相关文章

Spring - 事件监听机制

Spring - 事件监听机制Spring 事件驱动模型也是观察者模式很经典的应用。就是我们常见的项目中最常见的事件监听器。一、Spring 中观察者模式的四个角色1. 事件 - ApplicationEventApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的…

高并发设计技术方案

高并发设计技术方案 一、负载均衡对于一些大型系统,一般会采用 DNS+四层负载+七层负载的方式进行多层次负载均衡算法:随机算法、轮询算法、轮询权重算法、一致性哈希算法、最小连接、自适应算法。负载均衡工具:LVS、Nginx、HAProxy二、分布式微服务常用微服务框架有:Spring…

【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)

云资源同步是通过apikey去单向同步云上的主机资源和云区域信息,目前支持腾讯云和亚马逊云。主要特性 1、蓝鲸配置平台周期性的单向只读同步云主机和vpc(对应蓝鲸云区域)信息,第一次全量,后面增量 2、默认同步到主机池,也可自定义主机池模块,需要手动分配到业务 3、主机随…

Day22 第七章 回溯算法part01

77. 组合 216. 组合总和 III 17. 电话号码的字母组合任务 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 思路 组合思路 对于组合问题,是在一个集合中取不同的数,构成各种组合,本质上是一个多叉树的路径问题,即递归序遍历多叉树并收集信息,并…

有了Power BI还需要深入学习Excel图表制作吗?

Power BI和Excel都是微软公司的产品,但它们在数据分析和可视化方面有着不同的定位和功能。 Power BI是一个强大的商业分析工具,它提供了数据集成、数据建模、报告和仪表板的创建等功能。Power BI 特别适合处理大量数据,并且可以连接到多种数据源。它还支持高级的数据分析技术…

CSS3第一天(基础选择器+复合选择器)

1.选择器 基础选择器:标签选择器(某一类标签)、类选择器(一个或几个标签,最常用)、id选择器和通配符选择器标签名{属性1:属性值1;属性2:属性值2;...} 类选择器(可以多个标签使用) .类名{属性1:属性值1;...}<ul><li class="red">大雨</li…

代码随想录day22 || 77 组合,216 组合总和,17 电话号码字母组合

回溯问题回溯通常用来解决这些问题 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等等回溯的通用…

freemarker实现动态行单元格合并

原文链接:https://www.cnblogs.com/10158wsj/p/11211471.html https://blog.csdn.net/weixin_43667830/article/details/106936546 项目需求:项目中有个需求,需要将一些数据库中的数据根据需求导出,生成一个word,研究了一些技术,其中包括POI、freemaker,对比了一下实现过…

Xbox Game Pass Ultimate one dollar Trial All In One

Xbox Game Pass Ultimate one dollar Trial All In One XGPU $1 美元试用 Xbox Game Pass Ultimate — 14 Day Trial Recurs MonthlyXbox Game Pass Ultimate one dollar Trial All In OneXGPU $1 美元试用Xbox Game Pass Ultimate — 14 Day Trial Recurs Monthly Xbox Game P…

代码静态测试工具 Helix QAC 2024.1版新功能解读

Helix QAC 2024.1改进了对C++20和C23语言特性的支持,并增加了分析使用多个编译器的项目的新功能。此外,Validate增强了对于搜索功能和角色权限的用户体验,并且包括一个新的问题列表的CSV下载选项。此版本还包括对于C/C++的CWE、C的HKMC和MISRA C++:2023合规模块的扩展执行,…

苹果与英伟达公开分手,谷歌 TPU 芯片成为苹果 AI 训练新利器

苹果公司发布论文公开其 AI 模型的训练细节,放弃英伟达GPU而转向选择谷歌TPU芯片。科技巨头们在尖端 AI 训练方面开始寻求更多元化的算力硬件解决方案。北京时间 7 月 30 日,苹果公司发布了一篇研究论文,论文显示苹果公司使用了谷歌开发的 TPU 芯片而非英伟达的 GPU 芯片来训…