kingbase SQL 调优基础-04

本文详细介绍了数据库查询执行计划中的关键节点,如扫描节点(包括顺序、索引、位图、TID和覆盖索引)、连接节点(如嵌套循环、哈希和归并连接)、物化节点(如Material、Group和Sort)以及控制和并行节点。文章还提供了性能优化建议,如利用索引、过滤和连接顺序调整等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计划节点
执行计划内部是树状结构,里面包含的节点主要有 5 类:扫描节点(Scan Node),连接节点(Join Node),
物化节点(Materialization Node),控制节点(Control Node),并行节点(Parallel Node),每类节点又包括具体的
节点:
1. 扫描节点:
 顺序扫描(Seq scan)
 索引扫描(Index scan)
 位图扫描(Bitmap scan)
 TID 扫描(TID scan)
 覆盖索引扫描(Index only scan)
2. 连接节点:
 嵌套循环连接(NestLoop join)
 哈希连接(Hash join)
 归并连接(Merge join)
3. 物化节点:
 物化节点(Material)
 分组节点(Group)
 排序节点(Sort)
 去重节点(Unique)
4. 控制节点:
 Result 节点
 BitmapAnd/BitmapOr 节点
 Append 节点
 RecursiveUnion 节点
5. 并行节点:
 Gather/GatherMerge
 并行全表扫描(Parallel SeqScan)
 并行 hash(Parallel Hash)
 并行连接(Parallel HashJoin/MergeJoin)
 并行聚集(Partial/Finalize Aggregate/HashAggregate/GroupAggregate)
 并行 Append(Parallel Append)
 并行 UNION(Parallel UNION)

4.2.3.1 扫描节点
扫描过滤主要指数据扫描和数据过滤,目前扫描的方式有顺序扫描,索引扫描,位图扫描,TID 扫描,覆盖索引扫描等,各自有各自的适用情况。
一般扫描过滤的性能优化建议:
1)提早过滤
2)过滤性越高的字段需要越靠前,过滤性低的靠后
3)核心 SQL 可以考虑采用覆盖索引 indexonlyscan(更新少),确保尽可能高效
4)多 SQL 综合考虑,重复利用索引
5)不干扰过滤前提下,order by 排序字段进入索引
6)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。索引应该尽量小,尽量
使用字节数小的列建索引,不要对重复值多的列建单一索引。

顺序扫描(Seq scan)
原理:
根据实际的数据的存取顺序,连续的扫描所有数据。
适用情况:
数据量比较少的表,比如 1000 条以下;选择率比较高的数据,比如 50% 以上都选择出来了。
开启/关闭参数:
enable_seqscan=on/of

索引扫描(Index scan)
原理:
根据所建的索引,根据查询过滤条件扫描索引,因为索引是有序的,所以采用的折半查找,可以快速的找
到符合条件的索引数据,然后过滤条件和索引键值进行比较,符合条件的索引项,根据索引项记录的实际
数据存储位置读取数据,然后根据过滤条件进行过滤。
适用情况:
数据量比较大的而且选择比较少的,比如 10000 条以上记录,选择率在 1-20% 的。
开启/关闭参数:
enable_indexscan=on/of

位图扫描(Bitmap scan)
原理:
bitmap 扫描是 Bitmap Index Scan 和 Bitmap Heap Scan 的组合。
先通过 Bitmap Index Scan 索引扫描,在内存中创建一个位图表,每一个 bit 表示一个与过滤条件有关的页面。
此页面有可能有数据为 1,不可能为 0。
然后再通过 Bitmap Heap Scan 表扫描,在内存中创建好的位图表指针对应的页面进行顺序扫描,排除不符合的记录,返回需要的结果。
适用情况:
适用于列中有重复值,查询中包含 and、or 等范围查找的情况,其中对于有多个条件的组合(AND、OR),
可以分别对每个条件做 Bitmap Index Scan,然后再对结果进行 AND 或 OR 操作或当列中的数值散乱在内存中,用于整理数值。
开启/关闭参数:
enable_bitmapscan=on/of

TID 扫描(TID scan)
原理:
根据数据实际存储位置的 ctid 进行扫描,获取元组。通过隐藏字段 ctid,扫描 ctid 是 KingbaseES 中标
记数据位置的字段,通过这个字段来查找数据,速度非常快。
适用情况:
一般 where 条件带 citd 的。
开启/关闭参数:
enable_tidscan=on/off

覆盖索引扫描(Index only scan)
原理:
允许直接从索引得到元组,覆盖索引扫描要求查询中的某个表所需要数据均可以从这个表上的同一个索引的索引页面中获得。
适用情况:
更新少的表。
开启/关闭参数:
enable_indexonlyscan=on/of
注意: 使用覆盖索引之前,需要先对表进行 VACUUM 才能使覆盖索引被优化器使用。

4.2.3.2 连接节点
连接节点主要是根据枚举、动态规划,遗传算法估算连接代价确定连接顺序。
调整方法:
(1) 对所有查询的表做 analyze; 如果不做,连接顺序可能不是最优的,虽然做了也不一定最优。
(2) 调整合适的连接顺序,使得选择率低的 join 先执行
(3) 选择合适的连接算法

4.2.3.2.1 嵌套循环连接(NestLoop join)
原理:
扫描每一条外表的数据(m 条数据),然后和内表所有的记录(n 条数据)去连接,时间复杂度是 o(mn)
适用情况:
数据量不大的情况
开启/关闭参数:
enable_nestloop=on/off

4.2.3.2.2 哈希连接(Hash join)
原理:
对内表建立 hash 表,扫描所有内表数据到各个 hash 桶里面,建立 hash 桶,然后一行行扫描外表数据,
对外表数据进行 hash,hash 到某个桶里面,然后跟这个桶里面的数据进行连接。
适用情况:
数据分布比较随机无序,重复值不是特别多的情况。
开启/关闭参数:
enable_hashjoin=on/off

4.2.3.2.3 归并连接(Merge join)
原理:
对两个表的数据进行排序,然后做连接。
适用情况:
两个表的数据都是基本有序
开启/关闭参数:
enable_mergejoin=on/of

4.2.3.3 物化节点
物化节点是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行
操作 (例如聚集函数操作、没有索引辅助的排序等),这时要用物化节点将元组缓存起来。

4.2.3.3.1 物化节点(Material)
原理:
Material 节点用于缓存子节点结果,对于需要重复多次扫描的子节点(特别是扫描结果每次都相同时)可
以减少执行的代价。
适用情况:
结果在子查询中会被多次使用
开启/关闭参数:
enable_material=on/of

4.2.3.3.2 分组节点(Group)
(1)HashAggregate
原理:
通过 hash 算法,把相同的值 hash 到同一桶里面,然后求聚集。
适用情况:
适合数据无序的情况,
开启/关闭参数:
enable_hashagg=on/off

(2)GroupAggregate
原理:
通过排序的方式进行分组,然后执行聚集
适用情况:
适合数据基本有序的情况

(3) Aggregate
原理:
执行含有聚集函数的 GROUP BY 操作,该节点能够实现三种执行策略:Plain (不分组的聚集
计算)、Sorted(下层节点提供排好序的元组,类似 Group 的分组方法,然后进行聚集计算)、
Hash (首先对下层节点提供的未排序元组进行分组,然后进行计算)。
适用情况:
含有聚集函数的 GROUP BY 操作

4.2.3.3.3 排序节点(Sort)
原理:
明确对数据进行排序。我们不可能完全消除明确的排序,但是把关闭这个选项可以让优化器在存在其它方
法的时候优先选择其它方法。
适用情况:
输出结果是有序的的情况
开启/关闭参数:
enable_sort=on/off

4.2.3.3.4 去重节点(Unique)
原理:
Unique 节点用于对下层节点返回的已排序元组进行去重操作。由于下层节点获取到的元组已经排序,因
此在 Unique 节点的执行过程中只需要缓存上一个返回的元组,判断当前获 f 的元组是否和上一个元组在
指定属性上重复。如果重复,则忽略当前元组并继续从下层节点获取元组;如果不重复,则输出当前元组
并用它替换缓存中的元组。
适用情况:
Unique 节点一般用于处理査询中的 DISTINCT 关键字,但这不是唯一的处理方式。如果要求去重的属性
被“ORDER BY”子句引用时,一般会使用 Unique 节点进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值