摘要:analyze执行的是否及时,在一定程度上直接决定了SQL执行的快慢。

本文分享自华为云社区《一文读懂autoanalyze使用【这次高斯不是数学家】》,作者: leapdb。

analyze执行的是否及时,在一定程度上直接决定了SQL执行的快慢。因此,GaussDB(DWS)引入了自动统计信息收集,可以做到让用户不再担心统计信息是否过期。

1. 自动收集场景

需要进行自动统计信息收集的场景通常有五个:批量DML结束时,增量DML结束时,DDL结束时,查询开始时和后台定时任务。

所以,为了避免对DML,DDL带来不必要的性能开销和死锁风险,我们选择了在查询开始前触发analzye。

2. 自动收集原理

GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存种。

这些信息可以通过 “pg_stat_all_tables视图” 查询,也可以通过下面函数进行查询。

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_last_analyze_time --查询最近一次analyze时间

因此,根据共享内存中 "表自上次analyze以来修改过的条数" 是否超过一定阈值,就可以判定是否需要做analyze了。

3. 自动收集阈值

3.1 全局阈值

autovacuum_analyze_threshold #表触发analyze的最小修改量
autovacuum_analyze_scale_factor #表触发analyze时的修改百分比

当"表自上次analyze以来修改的条数" >= autovacuum_analyze_threshold + 表估算大小 * autovacuum_analyze_scale_factor时,需要自动触发analyze。

3.2 表级阈值

--设置表级阈值
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);

不同表的数据特征不一样,需要触发analyze的阈值可能有不同的需求。表级阈值优先级高于全局阈值。

3.3 查看表的修改量是否超过了阈值(仅当前CN)

postgres=# select pg_stat_get_local_analyze_status('t_analyze'::regclass);pg_stat_get_local_analyze_status
----------------------------------Analyze not needed
(1 row)

4. 自动收集方式

GaussDB(DWS)提供了三种场景下表的自动分析。

  • 当查询中存在“统计信息完全缺失”或“修改量达到analyze阈值”的表,且执行计划不采取FQS (Fast Query Shipping)执行时,则通过autoanalyze控制此场景下表统计信息的自动收集。此时,查询语句会等待统计信息收集成功后,生成更优的执行计划,再执行原查询语句。
  • 当autovacuum设置为on时,系统会定时启动autovacuum线程,对“修改量达到analyze阈值”的表在后台自动进行统计信息收集。

5.冻结统计信息

5.1 冻结表的distinct值

当一个表的distinct总是估算不准,例如:数据扎堆儿重复场景。如果表的distinct值固定,可以通过以下方式冻结表的distinct值。

postgres=# alter table lineitem alter l_orderkey set (n_distinct=0.9);
ALTER TABLEpostgres=# select relname,attname,attoptions from pg_attribute a,pg_class c where c.oid=a.attrelid and attname='l_orderkey';relname  |  attname   |    attoptions
----------+------------+------------------lineitem | l_orderkey | {n_distinct=0.9}
(1 row)postgres=# alter table lineitem alter l_orderkey reset (n_distinct);
ALTER TABLEpostgres=# select relname,attname,attoptions from pg_attribute a,pg_class c where c.oid=a.attrelid and attname='l_orderkey';relname  |  attname   | attoptions
----------+------------+------------lineitem | l_orderkey |
(1 row)

5.2. 冻结表的全部统计信息

如果表的数据特征基本不变,还可以冻结表的统计信息,来避免重复进行analyze。

alter table table_name set frozen_stats=true;

6. 手动查看表是否需要做analyze

a. 不想在业务高峰期时触发数据库后台任务,所以不愿意打开autovacuum来触发analyze,怎么办?

b. 业务修改了一批表,想立即对这些表马上做一次analyze,又不知道都有哪些表,怎么办?

c. 业务高峰来临前想对临近阈值的表都做一次analyze,怎么办?

我们将autovacuum检查阈值判断是否需要analyze逻辑,抽取成了函数,帮助用户灵活主动的检查哪些表需要做analyze。

6.1 判断表是否需要analyze(串行版,适用于所有历史版本)

-- the function for get all pg_stat_activity information in all CN of current cluster.
CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_table_need_analyze(in table_name text)
RETURNS BOOl
AS $$
DECLARErow_data record;coor_name record;fet_active text;fetch_coor text;relTuples int4;changedTuples int4:= 0;rel_anl_threshold int4;rel_anl_scale_factor float4;sys_anl_threshold int4;sys_anl_scale_factor float4;anl_threshold int4;anl_scale_factor float4;need_analyze bool := false;BEGIN--Get all the node namesfetch_coor := 'SELECT node_name FROM pgxc_node WHERE node_type=''C''';FOR coor_name IN EXECUTE(fetch_coor) LOOP fet_active := 'EXECUTE DIRECT ON (' || coor_name.node_name || ') ''SELECT pg_stat_get_tuples_changed(oid) from pg_class where relname = ''''|| table_name ||'''';''';FOR row_data IN EXECUTE(fet_active) LOOP changedTuples = changedTuples + row_data.pg_stat_get_tuples_changed;END LOOP;END LOOP;EXECUTE 'select pg_stat_get_live_tuples(oid) from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into relTuples;EXECUTE 'show autovacuum_analyze_threshold;' into sys_anl_threshold;EXECUTE 'show autovacuum_analyze_scale_factor;' into sys_anl_scale_factor;EXECUTE 'select (select option_value from pg_options_to_table(c.reloptions) where option_name = ''autovacuum_analyze_threshold'') as value from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into rel_anl_threshold;EXECUTE 'select (select option_value from pg_options_to_table(c.reloptions) where option_name = ''autovacuum_analyze_scale_factor'') as value from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into rel_anl_scale_factor;--dbms_output.put_line('relTuples='||relTuples||'; sys_anl_threshold='||sys_anl_threshold||'; sys_anl_scale_factor='||sys_anl_scale_factor||'; rel_anl_threshold='||rel_anl_threshold||'; rel_anl_scale_factor='||rel_anl_scale_factor||';');if rel_anl_threshold IS NOT NULL thenanl_threshold = rel_anl_threshold;elseanl_threshold = sys_anl_threshold;end if;if rel_anl_scale_factor IS NOT NULL thenanl_scale_factor = rel_anl_scale_factor;elseanl_scale_factor = sys_anl_scale_factor;end if;if changedTuples > anl_threshold + anl_scale_factor * relTuples thenneed_analyze := true;end if;return need_analyze;END; $$
LANGUAGE 'plpgsql';

6.2 判断表是否需要analyze(并行版,适用于支持并行执行框架的版本)

-- the function for get all pg_stat_activity information in all CN of current cluster.
--SELECT sum(a) FROM pg_catalog.pgxc_parallel_query('cn', 'SELECT 1::int FROM pg_class LIMIT 10') AS (a int); 利用并发执行框架
CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_table_need_analyze(in table_name text)
RETURNS BOOl
AS $$
DECLARErelTuples int4;changedTuples int4:= 0;rel_anl_threshold int4;rel_anl_scale_factor float4;sys_anl_threshold int4;sys_anl_scale_factor float4;anl_threshold int4;anl_scale_factor float4;need_analyze bool := false;BEGIN--Get all the node namesEXECUTE 'SELECT sum(a) FROM pg_catalog.pgxc_parallel_query(''cn'', ''SELECT pg_stat_get_tuples_changed(oid)::int4 from pg_class where relname = ''''|| table_name ||'''';'') AS (a int4);' into changedTuples;EXECUTE 'select pg_stat_get_live_tuples(oid) from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into relTuples;EXECUTE 'show autovacuum_analyze_threshold;' into sys_anl_threshold;EXECUTE 'show autovacuum_analyze_scale_factor;' into sys_anl_scale_factor;EXECUTE 'select (select option_value from pg_options_to_table(c.reloptions) where option_name = ''autovacuum_analyze_threshold'') as value from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into rel_anl_threshold;EXECUTE 'select (select option_value from pg_options_to_table(c.reloptions) where option_name = ''autovacuum_analyze_scale_factor'') as value from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into rel_anl_scale_factor;dbms_output.put_line('relTuples='||relTuples||'; sys_anl_threshold='||sys_anl_threshold||'; sys_anl_scale_factor='||sys_anl_scale_factor||'; rel_anl_threshold='||rel_anl_threshold||'; rel_anl_scale_factor='||rel_anl_scale_factor||';');if rel_anl_threshold IS NOT NULL thenanl_threshold = rel_anl_threshold;elseanl_threshold = sys_anl_threshold;end if;if rel_anl_scale_factor IS NOT NULL thenanl_scale_factor = rel_anl_scale_factor;elseanl_scale_factor = sys_anl_scale_factor;end if;if changedTuples > anl_threshold + anl_scale_factor * relTuples thenneed_analyze := true;end if;return need_analyze;END; $$
LANGUAGE 'plpgsql';

6.3 判断表是否需要analyze(自定义阈值)

-- the function for get all pg_stat_activity information in all CN of current cluster.
CREATE OR REPLACE FUNCTION pg_catalog.pgxc_stat_table_need_analyze(in table_name text, int anl_threshold, float anl_scale_factor)
RETURNS BOOl
AS $$
DECLARErelTuples int4;changedTuples int4:= 0;need_analyze bool := false;BEGIN--Get all the node namesEXECUTE 'SELECT sum(a) FROM pg_catalog.pgxc_parallel_query(''cn'', ''SELECT pg_stat_get_tuples_changed(oid)::int4 from pg_class where relname = ''''|| table_name ||'''';'') AS (a int4);' into changedTuples;EXECUTE 'select pg_stat_get_live_tuples(oid) from pg_class c where c.oid = '''|| table_name ||'''::REGCLASS;' into relTuples;if changedTuples > anl_threshold + anl_scale_factor * relTuples thenneed_analyze := true;end if;return need_analyze;END; $$
LANGUAGE 'plpgsql';

通“优化器触发的实时analyze”和“后台autovacuum触发的轮询analyze”,GaussDB(DWS)已经可以做到让用户不再关心表是否需要analyze。建议在最新版本中试用。

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

一文掌握数仓中auto analyze的使用相关推荐

  1. Apache Doris在美团外卖数仓中的应用实践

    来自:美团技术团队 美团外卖数据仓库通过MOLAP+ROLAP双引擎模式来适配不同应用场景.MOLAP引擎使用了Apache Kylin.ROLAP我们经过综合考虑,选择了Apache Doris.本 ...

  2. Hive 数仓中常见的日期转换操作

    (1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...

  3. 数仓中指标-标签,维度-度量,自然键-代理键,数据集市等各名词解析及关系

    序列号 内容 链接 1 大数据知识面试题-通用(2022版) https://blog.csdn.net/qq_43061290/article/details/124819089 2 大数据知识面试 ...

  4. 数仓中应该出现的所有表格

    数仓中应该出现的所有表格及其逻辑 1.ods_app_log(app日志贴源表) 计算:详情请见数据预处理整体代码实现 源表:原始数据 +--------------+---------------- ...

  5. 数仓中指标-标签,维度-度量,自然键-代理键等各名词深度解析

    作为一个数据人,是不是经常被各种名词围绕,是不是对其中很多概念认知模糊.有些词虽然只有一字之差,但是它们意思完全不同,今天我们就来了解下数仓建设及数据分析时常见的一些概念含义及它们之间的关系. 本文首 ...

  6. 数仓中的口径及常用口径

    最近去面试,被面试官问到,你们的数仓搭建过程中的口径是什么?当时一脸懵逼,不知道如何回答,这是什么鬼?后来阅读了几篇博文,哦~~~原来口径指的就是你的取数逻辑,也就是你们的一套规则,口径是统计学中的一 ...

  7. 数仓中关于“维度” “粒度”的详细理解(转)

    一.维度是什么 不懂就问,维度是什么?我们学习的自然反应,自然是去查阅专业资料. 1)阿里dataphin产品简介--基本概念是这样介绍维度:人们观察事物的角度,是指一种视角,是确定事物的多方位.多角 ...

  8. 聊聊数仓中TPCD-DSTPC-H与查询性能的那些事儿

    本文分享自华为云社区<GaussDB(DWS) <DWS之TPCD-DS&TPC-H与查询性能的那些事儿>>,作者: 一剑战八荒 . 1 综述 本文目标在于,详细讲述使 ...

  9. 一文讲述数仓组件SysCache

    摘要:SysCache是ThreadLocal结构,每个线程都具有各自的SysCache,其中存储的缓存信息由执行的业务决定. 本文分享自华为云社区<GaussDB(DWS)CBB组件之SysC ...

  10. 数仓中的星型模型和雪花模型

    1.概念 在多维分析的商业智能解决方案中,根据事实表和维度表的关系,又可将常见的数据模型分为星型模型和雪花型模型.在设计逻辑型数据的模型的时候,就应考虑数据是按照星型模型还是雪花型模型进行组织. 当所 ...

最新文章

  1. R语言ggplot2可视化绘制线图(line plot)、使用gghighlight包突出高亮满足条件的线图、并保留其它线图的色彩(而不是灰色)自定义非高亮线图的透明度
  2. 内存泄露一个经典例子
  3. Dockerfile中通过ENV指定动态参数在RUN时传递参数(部署后台jar包时指定端口为例)
  4. 基于知识图谱的问答系统入门—NLPCC2016KBQA数据集
  5. 用姓名字段统计人数_2019年度全国各地姓名报告分析汇总(全国、深圳、佛山、杭州)...
  6. css盒模型和元素绘制
  7. linux查看文件列表内存地址ll,linux指令之文件查看 ls
  8. shadows a parameter
  9. php 导出txt 缩进,indent - 缩进文本
  10. 支撑双十一的网络引擎:飞天洛神
  11. 去哪儿-16-detail-banner
  12. android libbfaac.so,Android中Json数据读取与创建
  13. 应用内广告帮助乐易实现收入+玩家时长双丰收
  14. 软件开发过程模型(瀑布模型,快速原型模型,螺旋模型)
  15. EDA课程设计-拔河游戏A设计
  16. Ubuntu20.04上安装Gnuradio3.8并且实现Pluto的配置
  17. c语言中错误executing,RetryableException: Read timed out executing POST 问题解决
  18. C语言根据国家英文首字母进行排序
  19. 学历证书查询唯一网站
  20. 微信二次开发第一弹 —— 与微信握手

热门文章

  1. home为什么是地点副词_home为什么可以做副词
  2. 【无标题】炒外汇是什么,为什么有人说炒外汇能发财
  3. 用大白话谈谈XSS与CSRF
  4. 虚拟现实(VR)技术的升级应用|时空克隆 三维视频融合 投影融合 点卯 魔镜系列
  5. maya中英文对比_maya菜单中英文对照表
  6. c语言 英文歌曲大赛,英文歌曲大赛活动方案
  7. 最小二乘法平面方程拟合计算, 点云法向量估算
  8. 迄今为止最完整的DDD实践
  9. CMOS搭建反相器、与非门和或非门以及OD和三态门
  10. 网页表格线框html,网页设计表格单元格线条及边框设置