优化大宽表查询性能,揭秘GaussDB(DWS) 谓词列analyze

news/2024/12/25 17:22:45/文章来源:https://www.cnblogs.com/huaweiyun/p/18631006

本文分享自华为云社区《GaussDB(DWS) 谓词列analyze揭秘》,作者:SmithCoder。

1. 前言

适用版本:【9.1.0.100(及以上)】

​当前GaussDB(DWS)中存在手动analyze,查询触发的动态analyze,以及后台线程的轮询analyze三种触发形式,其中动态analyze又分为light模式和normal模式,light模式是基于内存存储统计信息,normal模式是存储在系统表里,前者较为轻量,对目标表仅加一级锁。这些analyze默认都是对表全列进行采样,尤其对于大宽表analyze,耗时会比较久,其实很多时候计划生成所需的统计信息列只占一部分,如果只对这部分列进行采样计算,将会大大节省analyze的时间。因此GaussDB(DWS)引入了谓词列analyze。

2.原理介绍

​analyze的时候主要耗时在采样数据,对于非定长列如varchar,其统计信息的计算也耗时,耗时肯定随着表的列数增加而变长。谓词列analyze会在查询阶段对谓词列进行识别收集,当触发动态analyze,会只选择采样谓词列,手动谓词列analyze也会只采样谓词列部分。

谓词列通指于 WHERE 条件,join条件,group by中涉及到的列,更广义的是指所有需要用于计划生成需要统计信息列的列。

识别到的谓词列包含:

  • 条件谓词列

如比较(=,>,<),like, between,is,in, having,join on,MERGE on后面的列

  • 排序分组列

如group by, order by, distinct, over partition/order by列,union /minus列

  • 子查询引用列

等值条件列为一个子查询,子查询的对应的输出列;

cte中的一个列被外层引用为谓词列;

视图中的列被外层应用为谓词列;

agg列

  • 索引列

列建立了索引,相应的列也会被收集识别

  • 分布列

如果表建立了hash分别列,分布列也收集识别

3.使用介绍

下面分别介绍谓词列analyze支持两种形式:

  1. 动态采样谓词列analyze

  2. 手动谓词列analyze

3.1谓词列的guc控制

谓词列analyze的开启由guc参数analyze_predicate_column_threshold控制

参数说明:控制是否开启谓词列ANALYZE及限定支持的最小列数。该参数仅9.1.0.100及以上集群版本支持。

参数类型:SIGHUP

取值范围:整型,0~10000

  • 0表示关闭谓词列ANALYZE,不会收集谓词列以及对谓词列进行ANALYZE。

  • 大于0表示开启谓词列收集功能,且仅对列数大于等于此值的表进行谓词列ANALYZE。

默认值:10

3.2.动态采样谓词列analyze

前提:动态采样谓词列analyze只支持light模式

查询的时候会进行谓词列的识别,如果有新的谓词列或者修改计数达到,则会触发动态采样,会把新识别的和已有的谓词列进行采样计算 统计信息。

下面是按照analyze_predicate_column_threshold=1举例,计划中RunTime Analyze Information部分会打印出analyze的表和列信息。

create table t1(a int, b int, c int);
create table t2(a int, b int, c int);
set enable_fast_query_shipping=off;
set autoanalyze_mode=light;
-- 首次会收集所有列的统计信息
test=# explain select * from t1;QUERY PLAN                                                            
-------------------------------------------------------------------------------------------------------------------------------id |          operation           | E-rows | E-memory | E-width | E-costs ----+------------------------------+--------+----------+---------+---------1 | ->  Streaming (type: GATHER) |     20 |          |      12 | 16.10   2 |    ->  Seq Scan on t1        |     20 | 1MB      |      12 | 10.10   RunTime Analyze Information                                                   ------------------------------------------------------------------------------------------------------------------------------light runtime analyze on "public.t1" times:9.245ms, stats:sync, change:0(0 in xact), alive:0.000000, threshold:50.000000====== Query Summary =====   -------------------------------System available mem: 4710400KBQuery Max mem: 4710400KBQuery estimated mem: 1024KBinsert into t1 select generate_series(1, 100), 1;-- 修改计数达到,收集到了a,b两个谓词列,触发动态采样test=# explain select * from t1 where a=b;QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------id |          operation           | E-rows | E-memory | E-width | E-costs ----+------------------------------+--------+----------+---------+---------1 | ->  Streaming (type: GATHER) |      1 |          |      12 | 7.62    2 |    ->  Seq Scan on t1        |      1 | 1MB      |      12 | 1.62    RunTime Analyze Information                                                       -------------------------------------------------------------------------------------------------------------------------------light runtime analyze on "public.t1(a,b)" times:9.774ms, stats:sync, change:100(0 in xact), alive:100.000000, threshold:50Predicate Information (identified by plan id)---------------------------------------------2 --Seq Scan on t1Filter: (a = b)====== Query Summary =====   -------------------------------System available mem: 4710400KBQuery Max mem: 4710400KBQuery estimated mem: 1024KB
(19 rows)-- 修改计数达到后查询,查询下面的语句,会分别收集表t1,t2对应的谓词列
test=# explain select t1.* from t1 join t2 on t1.b=t2.c where t1.a=t2.a;QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------------------------id |              operation               | E-rows | E-memory | E-width | E-costs ----+--------------------------------------+--------+----------+---------+---------1 | ->  Streaming (type: GATHER)         |      2 |          |      12 | 21.55   2 |    ->  Hash Join (3,5)               |      2 | 1MB      |      12 | 15.55   3 |       ->  Streaming(type: BROADCAST) |    400 | 2MB      |       8 | 10.93   4 |          ->  Seq Scan on t2          |    200 | 1MB      |       8 | 2.00    5 |       ->  Hash                       |    200 | 16MB     |      12 | 2.00    6 |          ->  Seq Scan on t1          |    200 | 1MB      |      12 | 2.00    RunTime Analyze Information                                                        -------------------------------------------------------------------------------------------------------------------------------light runtime analyze on "public.t1(a,b)" times:11.031ms, stats:sync, change:100(0 in xact), alive:200.000000, threshold:60light runtime analyze on "public.t2(a,c)" times:8.571ms, stats:sync, change:100(0 in xact), alive:200.000000, threshold:60Predicate Information (identified by plan id)    ----------------------------------------------------2 --Hash Join (3,5)Hash Cond: ((t2.c = t1.b) AND (t2.a = t1.a))====== Query Summary =====   -------------------------------System available mem: 4710400KBQuery Max mem: 4710400KBQuery estimated mem: 4388KB-- 遇到新的谓词列且该列没有统计信息也会触发test=# explain select * from t1 where c=1;QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------id |          operation           | E-rows | E-memory | E-width | E-costs ----+------------------------------+--------+----------+---------+---------1 | ->  Streaming (type: GATHER) |      1 |          |      12 | 8.25    2 |    ->  Seq Scan on t1        |      1 | 1MB      |      12 | 2.25    RunTime Analyze Information                                                        -------------------------------------------------------------------------------------------------------------------------------light runtime analyze on "public.t1(a,b,c)" times:10.063ms, stats:sync, change:0(0 in xact), alive:200.000000, threshold:70

3.3手动谓词列

语法:analyze (predicate) tablename;

执行后,只会对当前为止收集到的谓词列进行采样,最后在查询业务稳定后使用;

3.4谓词列管理

  • 查询谓词列

通过函数pg_stat_get_predicate_columns可以查询当前表有哪些谓词列

test=# select pr.attnum,pa.attname from pg_catalog.pg_stat_get_predicate_columns('t1'::regclass) pr left join pg_attribute pa on pa.attrelid='t1'::regclass and pa.attnum = pr.attnum;attnum | attname 
--------+---------1 | a2 | b
(2 rows)
  • 清空谓词列

通过函数select * from pg_catalog.pg_stat_get_predicate_columns(‘t1_3’::regclass);可以清空表的谓词列,一般用于谓词列太多或者过期的情况去清空重建

4.总结

9.1.0.100版本中autoanalyze(light模式)和谓词列默认是开启的,用户无需感知。对于频繁大量更新和查询场景,此前的动态采样可能会耗时,影响查询业务,新增谓词列后会减少analyze的耗时,特别对大宽表场景耗时优化是可观的。

5. 参考文档

一文读懂analyze使用【这次高斯不是数学家】 https://bbs.huaweicloud.com/blogs/354294

一文读懂autoanalyze使用【这次高斯不是数学家】 https://bbs.huaweicloud.com/blogs/354298

华为开发者空间,汇聚鸿蒙、昇腾、鲲鹏、GaussDB、欧拉等各项根技术的开发资源及工具,致力于为每位开发者提供一台云主机、一套开发工具及云上存储空间,让开发者基于华为根生态创新。点击链接,免费领取您的专属云主机。

 

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

 

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

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

相关文章

指标管理+AI大模型深度融合,开启智能数据分析管理新时代

随着企业数字化转型的加速,数据管理和分析变得越来越重要。传统的指标管理平台虽然已经能够帮助企业有效地收集、计算、管理和展示关键指标,但在业务分析层面,面对日益复杂的数据环境和业务需求,单纯依靠人工分析已经难以满足高效、精准的管理要求。为此,将指标管理平台与…

nmon监控在linux环境下的安装

nmon下载官网: https://nmon.sourceforge.io/pmwiki.php?n=Site.Download一 、前言Nmon (Nigel’s Monitor)是由IBM 提供、免费监控 AIX 系统与 Linux 系统资源的工具。该工具可将服务器系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具(nmon analyse…

项目管理系统 - 项目管理软件 | 禅道项目管理工具

引言在当今数字化时代,项目管理对于企业的成功至关重要。项目管理系统和软件层出不穷,其中禅道项目管理工具以其独特的优势脱颖而出。禅道作为一款开源的项目管理软件,涵盖了项目管理的各个方面,为企业提供了全面、高效的管理解决方案。无论是软件开发项目、工程建设项目还…

18款顶级在线项目管理网站分享,助你高效管理项目

在当今数字化时代,项目管理的效率和效果对于企业的成功至关重要。在线项目管理工具为企业提供了便捷、高效的解决方案,帮助团队更好地规划、执行和监控项目。本文将介绍18款顶级在线项目管理网站,涵盖不同类型的项目管理工具,希望能为读者带来启发,助力他们在项目管理中取…

大模型提示工程

大模型提示工程转:9 大模型提示词工程应用_哔哩哔哩_bilibili 1. 原则2. 清晰的指令2.1. 分隔符大模型基于概率生成,每次生成的话不一样 2.2. 结构化输出使用网页,直接复制文本 使用接口,就用代码 2.3. 参考示例2.4. 角色扮演3. 让模型思考3.1. 指定步骤大模型只是提供的便…

配置manage路由,实现嵌套路由

1、npm install vue-router 引入vue-router main.ts增加配置 import router from ./routes createApp(App).use(router) 2、src下新建目录routes,新建index.ts // index.ts import { createRouter, createWebHistory } from vue-router; // 引入Vue组件 import Home from ../p…

leetcode 1045

leetcode 1045select customer_id from (select customer_id,count(*) mfrom (select distinct * from Customer) a group by customer_id having count(*) in (select count(*) from Product))p ;日记 23号是周一,到今天圣诞节都没有去上班,请假了,主要是软工的课设要忙,事…

ThreadLocal与InheritableThreadLocal

ThreadLocal底层是个map每次set值的时候把当前线程与值放到里面ThreadLocal.ThreadLocalMap threadLocals = null; 这种结构在大数据量并发请求时会,会产生内存泄漏。 请求时set进去,正常退出move掉,来不及remove的数据会停留在内存中,外界还有引用,gc不会收就会泄露如果子…

mysql 127.0.0.1连接正常,使用ip无法连接

mysql 127.0.0.1连接正常,使用ip无法连接 1. 使用 127.0.0.1连接mysql mysql -uroot -p -h127.0.0.12. 使用ip连接mysql # 查看当前虚机的ip地址 ip a # 使用ip地址连接mysql mysql -uroot -p -h192.168.91.133错误信息: ERROR 1130 (HY000): Host 192.168.91.133 is not allow…

el-Pagination的pagerCount传参报错

◾呈现的问题 控制台一直警告,看着很不爽,内容如下 [Vue warn]: Invalid prop: custom validator check failed for prop "pagerCount". found in ---> <ElPagination> <Pagination> <PolicyInfo> at src/views/policy/policyI…

最小二乘法-直线拟合-C语言

‌最小二乘法是一种数学统计方法,它通过最小化误差的平方和来寻找数据的最佳函数匹配‌。具体来说,它用于解决曲线拟合问题,即找到一个函数,使得该函数在给定数据点上的误差(通常是垂直距离)的平方和最小。这种方法广泛应用于数据分析和机器学习等领域,特别是在处理线性…

300+ Excel可视化图表模板:13种分类助你轻松制作专业图表

正文: 在职场中,专业的数据可视化能力是一项非常重要的技能。而使用高质量的Excel图表模板,可以让你的数据分析和展示工作更加高效!今天为大家推荐一份300+ Excel可视化图表模板合集,涵盖13种图表分类,适用于多种办公场景。 无论是数据分析、项目管理,还是日常汇报,这些…