当前位置: 首页 > news >正文

KingabseES执行计划-分区剪枝(partition pruning)

概述

分区修剪(Partition Pruning)是分区表性能的查询优化技术 。在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区。此功能使数据库只能在与SQL语句相关的分区上执行操作。

参数 enable_partition_pruning 设置启用或禁用分区剪枝。

分区修剪的好处

分区修剪大大减少了从磁盘检索的数据量,缩短了处理时间,从而提高了查询性能并优化了资源利用率。

根据实际的SQL语句,Kingbase数据库可使用静态或动态修剪。静态修剪发生在编译时,预先访问有关分区的信息。动态修剪发生在运行时,这意味着语句要访问的确切分区事先是未知的。静态修剪的示例场景是一个SQL语句,该语句包含一个WHERE条件,分区键列上有一个常量文本。动态修剪的一个例子是在WHERE条件中使用运算符或函数。

可用于分区修剪的信息

可以对分区列执行分区修剪。

当您在范围或列表分区列上使用range、LIKE、 = 和IN列表谓词时,以及当您在哈希分区列中使用 = 或 IN列表谓词后,Kingbase数据库将修剪分区。

对于多级分区对象,Kingbase数据库可以使用相关谓词在每个级别上进行修剪。

Kingbase使用分区列上的谓词执行分区修剪,如下所示:

  • 当使用范围分区时,Kingbase只访问分区p2和p3,表示2020年二月和三月的分区。
  • 当使用哈希子分区时,Kingbase只访问每个分区中存储productid=100行的一个子分区。子分区和谓词之间的映射是基于Kingbase的内部哈希分布函数计算的。
CREATE TABLE orders_range_hash
(productid  int,saledate   DATE,custid     int,totalprice numeric
)PARTITION BY RANGE (saledate) SUBPARTITION BY HASH (productid) SUBPARTITIONS 8(PARTITION p1 VALUES LESS THAN(TO_DATE('2020-01-01', 'YYYY-MM-DD')),PARTITION p2 VALUES LESS THAN(TO_DATE('2022-02-01', 'YYYY-MM-DD')),PARTITION p3 VALUES LESS THAN(TO_DATE('2022-03-01', 'YYYY-MM-DD')),PARTITION p4 VALUES LESS THAN(TO_DATE('2022-04-01', 'YYYY-MM-DD')));SELECT *
FROM orders_range_hash
WHERE saledate BETWEEN (TO_DATE('2020-01-10', 'YYYY-MM-DD')) AND (TO_DATE('2020-02-11', 'YYYY-MM-DD'))AND productid = 100;

如何确定是否已使用分区修剪

不仅在给定查询的规划期间可以执行分区剪枝,在其执行期间也能执行分区剪枝。 这非常有用,因为如果子句中包含查询规划时值未知的表达式时,这可以剪枝掉更多的分区; 例如在PREPARE语句中定义的参数会使用从子查询拿到的值,或者嵌套循环连接内侧关系上的参数化值。 执行期间的分区剪枝可能在下列任何时刻执行:

  • 在查询计划的初始化期间。对于执行的初始化阶段就已知值的参数,可以在这里执行分区剪枝。这个阶段中被剪枝掉的分区将不会显示在查询的EXPLAINEXPLAIN ANALYZE结果中。通过观察EXPLAIN输出的“Subplans Removed”属性,可以确定被剪枝掉的分区数。
  • 在查询计划的实际执行期间。这里可以使用只有在实际查询执行时才能知道的值执行分区剪枝。这包括来自子查询的值以及来自执行时参数的值(例如来自于参数化嵌套循环连接的参数)。由于在查询执行期间这些参数的值可能会改变多次,所以只要分区剪枝使用到的执行参数发生改变,就会执行一次分区剪枝。要判断分区是否在这个阶段被剪枝,需要仔细地观察EXPLAIN ANALYZE输出中的loops属性。 对应于不同分区的子计划可以具有不同的值,这取决于在执行期间每个分区被修剪的次数。 如果每次都被剪枝,有些分区可能会显示为(never executed)

静态分区修剪

根据静态谓词确定何时使用静态修剪。

在许多情况下,优化器确定编译时要访问的分区。如果使用静态谓词,则会发生静态分区修剪。

如果在解析时,优化器可以识别访问的连续分区集,则执行计划中,将显示正在访问的分区的条件范围。

CREATE TABLE orders_list
(productid  int,saledate   DATE,custid     int,totalprice numeric
)
PARTITION BY LIST (custid)(PARTITION p1 VALUES  (1,2),PARTITION p2 VALUES  (3,4),PARTITION p2 VALUES  (5,6));explain analyzed
select * from orders_list
where custid = 3;Seq Scan on orders_list_p2  (cost=0.00..23.38 rows=5 width=48) (actual time=0.016..0.020 rows=17 loops=1)Filter: (custid = 3)Rows Removed by Filter: 17
Planning Time: 0.107 ms
Execution Time: 0.037 ms

动态分区修剪

如果可以修剪,但无法进行静态修剪,则进行动态修剪,因为分区键值仅在执行时获知。

使用绑定变量进行动态修剪

对分区列使用绑定变量的语句会导致动态修剪。

\set vid 4explain select * from orders_list where custid = :vid;QUERY PLAN
----------------------------------------------------------------Seq Scan on orders_list_p2  (cost=0.00..23.38 rows=5 width=48)Filter: (custid = 4)
(2 行记录)do$$declarec1 text;beginfor c1 in execute 'explain select * from orders_list where custid = :vid' using (random() * 10)::int % 6 + 1loopraise info '%',c1;end loop;end;$$;信息:  Seq Scan on orders_list_p1  (cost=0.00..23.38 rows=5 width=48)
信息:    Filter: (custid = 2)
ANONYMOUS BLOCK

使用子查询进行动态修剪

对分区列显式使用子查询的语句会导致动态修剪。

分区节点的(never executed),表示执行了分区修剪。如果过滤条件使用IN子查询,则不能分区修剪。

explain (costs off,analyze)
with v as (select (random() * 10)::int % 2 + 1 id)
select *
from orders_list
where custid = (select v.id from v);QUERY PLAN
-----------------------------------------------------------------------------Append (actual time=0.028..0.033 rows=17 loops=1)CTE v->  Result (actual time=0.004..0.004 rows=1 loops=1)InitPlan 2 (returns $1)->  CTE Scan on v (actual time=0.007..0.008 rows=1 loops=1)->  Seq Scan on orders_list_p1 (actual time=0.015..0.018 rows=17 loops=1)Filter: (custid = $1)Rows Removed by Filter: 16->  Seq Scan on orders_list_p2 (never executed)Filter: (custid = $1)->  Seq Scan on orders_list_p3 (never executed)Filter: (custid = $1)Planning Time: 0.172 msExecution Time: 0.069 ms
(14 行记录)explain (costs off,analyze)
with v as (select (random() * 10)::int % 2 + 1 id)
select *
from orders_list
where custid in (select v.id from v);QUERY PLAN
-----------------------------------------------------------------------------------Hash Semi Join (actual time=0.046..0.067 rows=16 loops=1)Hash Cond: (orders_list_p1.custid = v.id)CTE v->  Result (actual time=0.005..0.005 rows=1 loops=1)->  Append (actual time=0.009..0.023 rows=100 loops=1)->  Seq Scan on orders_list_p1 (actual time=0.008..0.010 rows=33 loops=1)->  Seq Scan on orders_list_p2 (actual time=0.003..0.004 rows=34 loops=1)->  Seq Scan on orders_list_p3 (actual time=0.002..0.004 rows=33 loops=1)->  Hash (actual time=0.012..0.012 rows=1 loops=1)Buckets: 1024  Batches: 1  Memory Usage: 9kB->  CTE Scan on v (actual time=0.008..0.008 rows=1 loops=1)Planning Time: 0.303 msExecution Time: 0.095 ms
(13 行记录)

具有关联需求的动态修剪

等于(=)谓词,限制子查询的结果只能有一行。IN 、EXISTS、ANY 等方式,使用子查询时,不能执行动态修剪。多表连接,也不能执行动态修剪。

这种不能使用动态修剪的情况,可以使用LATERAL语法解决。

LATERAL子查询不能是简单子查询。

explain (costs off ,analyze)
with t (id) as (values (1), (2))
select *
from t, lateral ( select * from orders_list t1 where t1.custid = t.id limit all) t1;QUERY PLAN
--------------------------------------------------------------------------------------Nested Loop (actual time=0.022..0.037 rows=33 loops=1)->  Values Scan on "*VALUES*" (actual time=0.002..0.003 rows=2 loops=1)->  Append (actual time=0.009..0.013 rows=16 loops=2)->  Seq Scan on orders_list_p1 t1 (actual time=0.007..0.009 rows=16 loops=2)Filter: (custid = "*VALUES*".column1)Rows Removed by Filter: 16->  Seq Scan on orders_list_p2 t1_1 (never executed)Filter: (custid = "*VALUES*".column1)->  Seq Scan on orders_list_p3 t1_2 (never executed)Filter: (custid = "*VALUES*".column1)Planning Time: 0.189 msExecution Time: 0.072 ms

分区修剪提示

使用分区修剪时,应考虑以下事项:

  • 数据类型转换

    若要从分区修剪中获得最大的性能优势,应避免使用需要数据库转换指定数据类型的构造。

  • 函数调用

    避免在分区列上使用隐式或显式函数。如果您的查询通常使用函数调用,请考虑在这些情况下使用虚拟列和虚拟列分区,以从分区修剪中受益。

相关文章:

KingabseES执行计划-分区剪枝(partition pruning)

概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 。在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区。此功能使数据库只能在与SQL语句相关的分区上执行操作。 参数 enable_partition_pruning 设…...

Operator-sdk 在 KaiwuDB 容器云中的使用

一、使用背景KaiwuDB Operator 是一个自动运维部署工具,可以在 Kubernetes 环境上部署 KaiwuDB集群,借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上,让 KaiwuDB 成为真正的 Cloud-Native 数据库。使用传统的自动化工具会…...

【数据挖掘】2、数据预处理

文章目录一、数据预处理的意义1.1 缺失数据1.1.1 原因1.1.2 方案1.1.3 离群点分析1.2 重复数据1.2.1 原因1.2.2 去重的方案1.3 数据转换1.4 数据描述二、数据预处理方法2.1 特征选择 Feature Selection2.2 特征提取 Feature Extraction2.2.1 PCA 主成分分析2.2.2 LDA 线性判别分…...

(四十六)大白话在数据库里,哪些操作会导致在表级别加锁呢?

之前我们已经给大家讲解了数据库里的行锁的概念,其实还是比较简单,容易理解的,因为在讲解锁这个概念之前,对于多事务并发以及隔离,我们已经深入讲解过了,所以大家应该很容易在脑子里有一个多事务并发执行的…...

【Android源码面试宝典】MMKV从使用到原理分析(二)

上一章节,我们从使用入手,进行了MMKV的简单讲解,我们通过分析简单的运行时日志,从中大概猜到了一些MMKV的代码内部流程,同时,我们也提出了若干的疑问?还是那句话,带着目标(问题)去阅读一篇源码,那么往往收获的知识,更加深入&扎实。 本节,我们一起来从源码层次…...

如何使用ADFSRelay分析和研究针对ADFS的NTLM中继攻击

关于ADFSRelay ADFSRelay是一款功能强大的概念验证工具,可以帮助广大研究人员分析和研究针对ADFS的NTLM中继攻击。 ADFSRelay这款工具由NTLMParse和ADFSRelay这两个实用程序组成。其中,NTLMParse用于解码base64编码的NTLM消息,并打印有关消…...

【Python学习笔记】第二十二节 Python XML 解析

一、什么是XMLXML即ExtentsibleMarkup Language(可扩展标记语言),是用来定义其它语言的一种元语言。XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则,它没有标签集(tagset),也没有语法规则(grammatical rule)。任何XML文档对任何…...

5分钟轻松拿下Java枚举

文章目录一、枚举(Enum)1.1 枚举概述1.2 定义枚举类型1.2.1 静态常量案例1.2.2 枚举案例1.2.3 枚举与switch1.3 枚举的用法1.3.1 枚举类的成员1.3.2 枚举类的构造方法1)枚举的无参构造方法2)枚举的有参构造方法1.3.3 枚举中的抽象方法1.4 Enum 类1.4.1 E…...

华为OD机试【独家】提供C语言题解 - 最小传递延迟

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明最小…...

【Web前端】关于JS数组方法的一些理解

一、具备栈特性的方法unshift(...items: T[]) : number将一个或多个元素添加到数组的开头,并返回该数组的新长度。shift(): T | undefined从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。二、具备队列特性的方法push(...items: T[]): …...

多智能体集群协同控制笔记(1):线性无领航多智能体系统的一致性

对于连续时间高阶线性多智能体系统的状态方程为: x˙i(t)Axi(t)Bui(t),i1,2..N\dot {\mathbf{x}}_i(t)A\mathbf{x}_i(t)B\mathbf{u}_i(t),i1,2..N x˙i​(t)Axi​(t)Bui​(t),i1,2..N 下标iii代表第iii个智能体,ui(t)∈Rq1\mathbf{u}_i(t)\in R^{q \time…...

hadoop-Yarn资源调度器【尚硅谷】

大数据学习笔记 Yarn资源调度器 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行与操作系统之上的应用程序。 (也就是负责MapTask、ReduceTask等任…...

聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题

前言 不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。 通常遇到这种场景,常用…...

Flume 使用小案例

案例一:采集文件内容上传到HDFS 1)把Agent的配置保存到flume的conf目录下的 file-to-hdfs.conf 文件中 # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1 # Describe/configure the source a1.sources.r1.type spoo…...

DLO-SLAM代码阅读

文章目录DLO-SLAM点评代码解析OdomNode代码结构主函数 main激光回调函数 icpCB初始化 initializeDLO重力对齐 gravityAlign点云预处理 preprocessPoints关键帧指标 computeMetrics设定关键帧阈值setAdaptiveParams初始化目标数据 initializeInputTarget设置源数据 setInputSour…...

X和Ku波段小尺寸无线电设计

卫星通信、雷达和信号情报(SIGINT)领域的许多航空航天和防务电子系统早就要求使用一部分或全部X和Ku频段。随着这些应用转向更加便携的平台,如无人机(UAV)和手持式无线电等,开发在X和Ku波段工作,同时仍然保持极高性能水平的新型小尺寸、低功耗…...

推荐算法 - 汇总

本文主要对推荐算法整体知识点做汇总,做到总体的理解;深入理解需要再看专业的材料。推荐算法的意义推荐根据用户兴趣和行为特点,向用户推荐所需的信息或商品,帮助用户在海量信息中快速发现真正所需的商品,提高用户黏性…...

Android 系统的启动流程

前言:从开机的那一刻,到开机完成后launcher将所有应用进行图标展示的这个过程,大概会有哪一些操作?执行了哪些代码?作为Android开发工程师的我们,有必要好好的梳理一遍。既然要梳理Android系统的启动流程&a…...

自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分

我的学习心得,我认为能不能自学成功的要素有两点。 第一点就是自身的问题,虽然想要转行学习Java的人很多,但是非常强烈的想要转行学好的人是小部分。而大部分人只是抱着试试的心态来学习Java,这是完全不可能的。所以能不能学成Jav…...

Vue 3 第五章:reactive全家桶

文章目录1. reactive1.1. reactive函数创建一个响应式对象1.2. 修改reactive创建的响应式对象的属性2. readOnly2.1. 使用 readonly 函数创建一个只读的响应式对象2.2. 如何修改嵌套在只读响应式对象中的对象?3. shallowReactive3.1. 使用 shallowReactive 函数创建一个浅层响…...

PyFluent:重构CFD仿真流程的技术赋能与效能跃迁

PyFluent:重构CFD仿真流程的技术赋能与效能跃迁 【免费下载链接】pyfluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent 在现代工程仿真领域,计算流体动力学(CFD)技术正经历着从手动操作向自动化流程的深刻转…...

遗传算法 TWVRP 运筹优化调度 混合整数规划 带时间窗多车的物流配送路径优化 贵有贵的道理...

遗传算法 TWVRP 运筹优化调度 混合整数规划 带时间窗多车的物流配送路径优化 贵有贵的道理,代码质量高,有中文注释 只有修改表格中数据即可生成想要的配送路径上周点奶茶发现骑手绕了远路还差点超时,突然就想起之前折腾过的带时间窗多车配送路…...

SAP资产主数据批量修改避坑大全:GGB1替代+AR31工作清单配置详解(含日期字段特殊处理)

SAP资产主数据批量修改实战指南:从GGB1替代到AR31工作清单全流程解析 当财务团队需要对上千条资产记录进行成本中心迁移时,手工修改不仅效率低下,还容易产生数据不一致。SAP系统提供的GGB1替代规则与AR31工作清单组合方案,正是解决…...

OpenClaw 全面解析:Token时代的iPhone如何颠覆开发者工作流?

前言:两周15万Star背后的技术革命 2026年初,一个名为 OpenClaw 的开源项目在 GitHub 上以惊人速度走红——两周内突破 15 万 Star,如今已达 310k Star,成为近年来增速最快的开源项目之一。 黄仁勋在最新访谈中将其称为 “Token时代…...

Windows 10/11 下用 Anaconda 和 Hadoop 3.3.6 搞定 PySpark 环境,附赠 Winutils 下载避坑指南

Windows 10/11 下用 Anaconda 和 Hadoop 3.3.6 搞定 PySpark 环境,附赠 Winutils 下载避坑指南 在 Windows 系统上搭建 PySpark 开发环境,对于数据科学家和开发者来说既是一个必经之路,也是一场充满挑战的冒险。不同于 Linux 或 macOS 系统&a…...

3个AI脚本让Illustrator设计效率提升300%:从重复劳动到创意爆发

3个AI脚本让Illustrator设计效率提升300%:从重复劳动到创意爆发 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 作为设计师,你是否每天花费40%以上时间在重复…...

告别手动操作!用Word宏/VBA实现doc批量转docx的隐藏技巧

职场效率革命:Word宏/VBA零代码实现文档格式批量升级 每天面对堆积如山的.doc文件,行政文员小张总要手动打开每个文件另存为.docx格式——这个机械操作不仅耗时费力,还容易遗漏文件。其实微软Office内置的自动化工具能完美解决这个问题&#…...

APISIX Dashboard实战:从零配置JWT认证网关(含Node.js后端对接)

APISIX Dashboard实战:从零构建JWT认证网关与Node.js后端深度集成 引言:为什么选择APISIX作为API网关? 在现代微服务架构中,API网关扮演着流量调度和安全防护的双重角色。APISIX作为云原生API网关的佼佼者,凭借其动态…...

最完整的大模型算法工程师技术栈图谱(2026版)

目录 一、基础能力(所有AI工程师的底座) 1 编程语言 2 数据结构与算法 3 数学基础 二、深度学习基础 深度学习模型基础 三、大模型核心技术 1 Transformer架构 2 预训练 3 Tokenizer 四、大模型训练体系 1 分布式训练 2 训练优化技术 3 微…...

Qwen3-TTS-VoiceDesign实战案例:用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频

Qwen3-TTS-VoiceDesign实战案例:用‘撒娇稚嫩萝莉声’描述生成高拟真TTS音频 1. 项目概述与核心价值 Qwen3-TTS-VoiceDesign是一个让人惊艳的语音合成模型,它最大的特点就是能用简单的文字描述,生成你想要的任何声音风格。想象一下&#xf…...