作者小头像 Lv.2
68 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
65
3
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

他的回复: 快问快答: 1. GaussDB(DWS)中也可以开启 autoanalyze ,它们是基于什么数据来做的? 答:基于表自上次analyze以来的历史累积修改量。 2. GaussDB(DWS)也有monitor DML/TRUNCATE的功能? 答:GaussDB(DWS)在SQL执行过程中会自动收集表的增删改查等相关信息。 3. GaussDB(DWS)什么时候触发写入类似的monitor表? 答:监控数据在内存中存储并异步存盘到pgstat文件。比较轻量化,不会写入系统表。 基本原理:GaussDB(DWS)在SQL执行过程中会自动收集表的增删改查相关信息,在事务提交或回滚后,将这些信息发送给数据库后台PgCollector线程维护。PgCollector线程会异步的将收集的统计信息持久化到pgstat文件。 这些运行时统计信息,可以通过直接查询pgstat相关接口获取: pg_stat_get_tuples_inserted --表insert条数 pg_stat_get_tuples_updated --表update条数 pg_stat_get_tuples_deleted --表delete条数 pg_stat_get_tuples_changed --表自上次analyze以来,修改的条数 pg_stat_get_live_tuples --analyze估算的表可见元组数 pg_stat_get_dead_tuples --analyze估算的表删除元组数 pg_stat_get_last_analyze_time --查询最近一次analyze时间 下面介绍一下数据库是如何触发auto analzye的: 1. 查询表的历史累积修改量 --查看该表全局自上次analyze以来历史累积修改量 postgres=# select pg_stat_get_tuples_changed('t_analyze'::REGCLASS); pg_stat_get_tuples_changed ---------------------------- 3000 (1 row) --查看该表在当前节点自上次analyze以来历史累积修改量(8.1.2版本以上) postgres=# select pg_stat_get_local_tuples_changed('t_analyze'::REGCLASS); pg_stat_get_local_tuples_changed ---------------------------------- 3000 (1 row) 2. 查看表需要触发analyze的阈值 全局阈值: autovacuum_analyze_scale_factor #表触发analyze时的修改百分比 autovacuum_analyze_threshold #触发analyze的最小修改量 当表自上次analyze以来的历史累积修改量,超过autovacuum_analyze_threshold + 表估算大小 * autovacuum_analyze_scale_factor 时,后台auto vacuum线程会每15分钟检查并触发该表的analyze。 表级阈值: 因为不同数据特征表,需要触发analyze的阈值可能会有差异,因此GaussDB(DWS)也支持设置表级的analyze阈值,其优先级高于全局阈值。 --设置表级阈值 ALTER TABLE item SET (autovacuum_analyze_threshold=50); ALTER TABLE item SET (autovacuum_analyze_scale_factor=0.1); --查询阈值 postgres=# select pg_options_to_table(reloptions) from pg_class where relname='item'; pg_options_to_table --------------------------------------- (autovacuum_analyze_threshold,50) (autovacuum_analyze_scale_factor,0.1) (2 rows) --重置阈值 ALTER TABLE item RESET (autovacuum_analyze_threshold); ALTER TABLE item RESET (autovacuum_analyze_scale_factor); 3. 触发auto analyze 如果“表自上次analyze以来的历史累积修改量”超过了“表的analyze阈值”,就可以触发auto analyze了。 目前有多种触发auto analyze的时机: 1. 数据库后台auto vauum线程,每15分钟检查一次,有哪些表需要analyze。 2. SQL查询时如果表无统计信息,则由优化器直接触发auto analyze,并用新的统计信息生成最优的执行计划。 3. 执行SQL时如果表的修改量超过阈值,则实时触发auto analzye。 最后,为了让用户能更清晰的知道哪些表需要analyze,我们还提供了快速查询的接口: --查看该表是否需要analyze(8.1.2版本以上) postgres=# select pg_stat_get_local_analyze_status('t_analyze'::REGCLASS); pg_stat_get_local_analyze_status ---------------------------------- Analyze not needed (1 row) 展望 统计信息是否能自动,快速且准确的收集,直接影响了是否能选出最优的执行计划。因此,GaussDB(DWS)在这些方面也一直积极努力的投入。目前在最新的在研版本中,将会有以下几个方面的亮点呈现,欢迎关注。 1. analyze透明化(多种时机自动触发,让用户尽可能不再关心analzye) 2. analyze采样大小自动化(针对AP场景的超大表,自适应调整采样大小) 3. 基础采样算法优化(采样不变的情况下,提升统计信息准确性) 4. 执行性能的提升(减少资源消耗,为用户业务让出资源)
发布时间 2021-01-27 16:01:25 最后回复 yangjinke 2022-01-07 16:01:25 版块 数仓GaussDB(DWS)
29189 322 1
发布时间 2021-01-27 16:01:25 最后回复 yangjinke 2022-01-07 16:01:25 版块 数仓GaussDB(DWS)
29189 322 1
发布时间 2021-01-27 16:01:25 最后回复 yangjinke 2022-01-07 16:01:25 版块 数仓GaussDB(DWS)
29189 322 1