大数据时代,数据量呈爆发式增长,经常面临百亿、千亿数据查询场景,当数据仓库数据量较大、SQL语句执行效率低时,数据仓库性能会受到影响。本文将深入讲解在GaussDB(DWS)中如何进行表结构设计,如何进行SQL优化,如何查找慢SQL和高频SQL,提高数据仓库的性能和响应速度。
当前市场上的数据库产品,基本上都是基于CBO模型的优化器,因此统计信息的及时收集显得很重要
基于硬编码的多组内置规则选取最优执行计划,比如优先使用唯一约束或主键来定位存储单元、优先使用Hash索引等等。它不考虑表大小、列大小、数据分布、排序占用的内存大小。优点:基于经验总结出来的一套规则,它的优点是执行计划稳定缺点:对开发者的SQL开发能力要求非常高,只有熟悉各种规则,才能写出优质的SQL。当表数据虽发生变化,原来的执行计划不是最优的时候,优化无法自动调整。
该优化器通过根据优化规则对关系表达式进行转换,生成多个执行计划,然后CBO会通过根据统计信息(Statistics)和代价模型(Cost Model)计算各种可能“执行计划”的“代价”,即COST,从中选用COST最低的执行方案,作为实际运行方案。优点:可以自动适应表数据量变化,计算量发生变化,自动调节,选择较优的执行计划缺点: 依赖于COST计算模型重要的影响因子: 统计信息,需要给优化器提供准确的统计信息,才能做出好的执行计划。
SQL + 表统计信息 =>优化器 => 最优执行计划
较各种操作代价时的相对性能指标
PostgresQL的查询优化是基于代价(Cost)的。代价是一个无量纲的值,它并不是一种绝对的性能指标,但可以作为比
全表顺序扫描并过滤,代价公式为:
Cost = seq scan cost*relpages + cpu tuple cost*reltuples + cpu operator cost*reltuples
COST计算的两个影响因素,其中数据库参数基本按实践值,一次修改长期不变;表的统计信息,要及时收集,以反映最真实的表数据状态
使用explain命令可以查看优化器为每个查询生成的具体执行计划
edw_db=#h explainCommand:EXPLAINDescription:show the execution plan of a statementsyntax :...] ) ] statement;EXPLAINoptionANALYSE 3 ][VERBOSE ]PERFORMANCE statement;EXPLAINANALYZEEXPLAINSTATS[ boolean ] ) statement;
where option can be:ANALYZE[boolean ]ANALYSEbooleanVERBOSEbooleanCOSTSbooleanCPUboolean]DETAIL[booleanNODESboolean]NUM_NODES[booleanBUFFERSbooTeanTIMINGbooleanPLAN [booleanFORMATTEXTXMLJSON YAML 3
EXPLAIN VERBOSE
SELECT
sum(l extendedprice * (1 - l discount)) AS revenue
FROM orders
INNER JOIN lineitem ON l orderkey = o orderkey
o orderdate >=11994-01-01'::date AND o orderdate <1994-01-01'::date +WHEREinterval1 year';
EXPLAIN PERFORMANCE
SELECT
sum(l extendedprice * (1 - l discount)) AS revenue
FROM orders
INNER JOIN lineitem ON l orderkey = o orderkey
WHERE o orderdate >= '1994-01-01'::date AND o orderdate < '994-01-01'::date + interval '1 year';
执行计划阅读方法:
从最右缩进开始;从下往上逐步执行,算子后面的数字表示算子编号,左边表示外表,右边表示内表(如Hash Joim(3.8),3号算子做为外表,8号算子做为内表);
算子运行时间=当前算子的a-time减去下层算子的a-time(如2号算子Hash Jomn(3.8= 25388-21483)
功能:扫描算子的作用是扫描表,每次获取一条元组作为上层节点的输入。
扫描算子普遍存在于查询计划树的叶子节点,它不仅可以扫描表,还可以扫描函数的结果集、链表结构、子查询结果集等
连接算子对应于关系代数中的连接操作,主要的几种连接类型如下:
功能: Streaming是一个特殊的算子,它实现了分布式架构的核心数据shuffle功能,Streaming共有三种形态,分别对应分布式结构下不同的数据shuffle功能
物化算子是一类可以缓存元组的节点
在执行计划中,很多扩展的物理操作符需要首先获取所有的元组才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这是要用物化算子将元组缓存起来
本节主要介绍通过Explain命令查看查询语句的执行计划的两种常用方法,并以示例的查询语句为例,详细介绍Explain Performance 命令收集到的各部分执行信息及SQL性能调优过程需要重点关注的信息。
DWS逻辑架构
全并行架构,发挥系统极致性能
核心问题:
x86 PC Server集群架构下,单核处理能力有限,如何利用x86多核计算资源,提升集群处理性能:华为鳃鹏众核架构下,如何解决众核、Numa架构资源利用问题;
核心问题:分布式架构下,单机优化方法无法保证最优计划的生成
问题一: 单机SQL逻辑无法完全实现分布式执行?
核心技术:
- 30+查询重写技术,10+项分布式查询重写,在分布式场景下消除NestLoop和子查询等瓶颈运算
- 查询重写相关专利4篇
问题二: 单机统计信息不能全面反应分布式数据特征
核心技术:
- 单机+全局统计信息收集、自动统计信息收集技
- 基于Poisson的估算模型、全局/单点cost估算模型
- Local+Global结合的数据处理估算模型
问题三: 数据倾斜会造成分布式执行木桶效应
核心技术:
- 静态模型:分布式倾斜估算模型
- 动态模型:RLBT(Runtime Load BalanceTechnology)动态倾斜处理方案
基于topSQL的慢SQL识别
topSQL记录了查询作业运行结束时的资源使用情况(包括内存、下盘、CPU时间、IO等)和运行状态信息(包括报错、终止,异学等)以及性能告警信息
SELECTqueryid,start timeduration,--执行时间warning,--SQL自诊断信息query--SQL语句queryplan--SQL语句简单的explainFROM pgxc wlm session infoWHERE username =edw poc’-- 用户
AND dbname =pluat'-- 数据库AND duration>10000-- 长SQL值,单位msAND start time BETWEEN now0 AND (now0 -interva/ 1 days --SQL时间段ORDER BYduration DESC-- 按照执行时长倒序输出LIMIT100:-- top100
高频SOL: SELECTunique sl id.count() FROM pgxc wlm session imfo WHERE start time >='2023-04-20 15:00:00' and stat time <=2023-04-20 18:00:00GROUPBYunique sql id ORDER BY 2 desc;
CPUSOL: SELECT start time.finish time.block time.usemame.duration.status.abort infosubstr(query.1.100) FROMpgxc wlm session info WHERE start time >=(now0 - interval '1 daty) ORDER BY ax cpu time desc;
不下推SOL:
SELECT start timefinish time,block timeusenameduration.status,abot infosubstr(query,1.100) FROMpgxc wlm session imfo WHERE start time >=(now0 - interval "1 daty) and waming like "%can not be shipped%' ORDER BY duration desc:
复杂SOL:
SELECT nodenamestart time.duration.substring(guery .1.40) as query name.(leneth(query plan) -length(replace(query plan.Streaming,"))/ length(Streaming) as stream count FROM pgxc wlm session info WHERE stream count >= 10 and stat time >= (now0interval '1 day) ORDER BY stream count DESC:
历史SQL:
SELECT start time.duraton.block time.statusspil info.abort info FROMpgxc wlm session imfo WHERE start time between'2023-08-01'and2023-08-08ORDERBYduration DESC
集群部署有SA协助规划,只关注表定义创建策略
数据分布在DN上,好的表定义要求
判断数据是否存在存储倾斜的方法: table distribution函数
在线判定列是否倾斜: table skewness函数
常见场景
SELECT
count(distinctc custkey)FROM customerWHERE c custkey IN (SELECT DISTINCT o custkeyFROM orders custkey #原orders表的分布列为订单号o orderkeyorders custkey表为调整分布列为客户编号o custkeyALTER TABLE orders DISTRIBUTE BY HASH(o custkey)
优化原理:入库时候进行局部排序换查询性能
本节主要从表定义角度,介绍静态调优的几种常用方法,从而指导用户根据业务场景正确选择表的存储类型、分布方式和分布列,合理使用局部聚簇、分区表来设计和定义表,提高SQL语句的查询性能
动态调优,即执行态调优,是一个不断分析与尝试的过程
首先,试跑Query;然后,判断性能是否满足客户需求;如果不满足客户需求,则需要进一步分析性能瓶颈点获取性能瓶颈点之后进行针对性优化,重新试跑,一直到满足性能目标。
可用的统计信息有哪些?
统计信息(表数据特征)
优化器 (基于代价的优化(Cost-Based Optimization,简称CBO
统计信息如何收集?
如何操作
收集统计信息前后执行计划对比分析
没有收集统计信息的计划中,估计值E-rows比实际值小
没有收集统计信息的计划中,出现两个低效的Nest Loop算子
示例:
查询所有供货商在1994年1月1日起的1年间为公司带来的总收入
SELECT
sum(l extendedprice * (1 - l discount)) AS revenueFROM customer, orders, lineitem, supplierWHERE c custkey = o custkeyAND l orderkey = o orderkeyAND I suppkey = s suppkeyAND o orderdate >=1994-01-01'::dateAND o orderdate <11994-01-01'::date + interval '1 year'
并行计算能力是GaussDB(DWS)的性能优势
优化器在分布式框架下有三种执行规划策
下推语句计划
CN发送查询语句到DN直接执行,执行结果返回给CN
分布式计划
CN生成计划树,发送计划树给DN执行
DN执行完后,将结果返回给CN
不下推计划: CN承载大量计算任务,导致性能劣化!
优化器将部分查询(多为基表扫描语句)
常见的不下推因素
表连接(Join): 根据特定规则从两个其他表(真实表或生成表)中派生出结果集
join语法
T1 Join type T2 [join condition]
join类型
语法层支持: 内连接(lnner Join)、外连接(Outer Jin) 和交叉连接(或笛卡尔积,CrossJoin)
T1( [INNER]
T1
[INNER]
TI NATURAL
( LEFT
RIGHT
( LEFT I RIGHT
[INNER]
( LEET
FULL
FULL 1
RIGHT
[OUTER1
[OUTER]
JOINT2ON boolean expression
T2USING ( join column list )
JOIN
FULL 1
OUTER] JOIN T2
策略1:选择高效的Join方式
改写SQL实现HashJoin
优化策略: 尝试将不等值Join条件转化为等值Join条件
策略2:选择合适的内外表
HashJoin:内表小,外表大,执行高效!
使用Plan Hint调整内外表顺序
本节简要介绍动态调优的基本流程,常用的统计信息及其收集方法,如何根据执行信息分析SQL语句的性能瓶颈,并着重介绍因计划不下推造成性能问题的典型场景码优化等收
在大数据时代,数据量剧增,查询效率成为关键。
GaussDBDWS作为高效的数据仓库解决方案,其查询优化技术是核心。首先,优化器是数据库查询优化的核心组件,分为基于规则的优化器和基于成本的优化器。前者根据硬编码规则选取最优执行计划,稳定但要求高;后者则依赖统计信息和代价模型,能自动适应数据变化,选择最优执行计划。其次,执行计划是查询执行过程的描述,用于分析和调优。最后,调优技术包括静态和动态调优,前者针对已知问题优化,后者则实时调整。此外,分布式优化技术也能大幅提升分布式执行性能。
总之,要提高GaussDBDWS的数据仓库性能和响应速度,需关注表结构设计、SQL优化、慢SQL和高频SQL查找等关键环节。准确统计信息是优化器做出好决策的前提。深入理解执行计划和优化器原理,结合实际场景灵活运用调优技术,是提升大数据查询效率的关键。