金仓数据库KingbaseES查询计划剖析

news2024/11/21 2:35:16

目录

1、KingbaseES数据库中的查询生命周期

2、数据设置

3、KingbaseES解释一个查询

4、什么是数据库中的缓冲区和缓存?

5、VERBOSE 命令参数

6、KingbaseES中的 FORMAT 解释

7、总结EXPLAIN使用方式

8、执行计划查看

了解KingbaseES查询计划对于开发人员和数据库管理员来说都是一项关键技能。这可能是优化SQL查询的第一件事,也是验证优化的SQL查询是否确实实现期望结果的方式。

1、KingbaseES数据库中的查询生命周期

每个查询都会经历不同的阶段,了解下面周期的每个阶段,对理解数据库是很重要的。

 

第一阶段是通过JDBC/ODBC或通过其他方式如KSQL(客户端工具)连接到数据库。

第二阶段是将查询转换为解析树的格式,就像 SQL 查询的编译形式。

第三阶段是重写系统/规则系统。它采用从第二阶段生成的解析树,并以规划器/优化器可以开始在其中工作的方式重写它。

第四阶段是最重要数据库的核心。规划器使得知执行器知道如何执行查询、使用什么索引、是否扫描较小的表以消除更多不必要的记录等问题。

第五个也是最后一个阶段是执行器,它执行实际执行并返回结果。

下面将描述第四阶段的工作内容。

2、数据设置

首先建立一些表来运行本文的实验。

CREATE TABLE TEST_TABLE AS select id, lpad(id,10,'0') code, md5(random()) name from generate_series(1, 1000000) id;

该表现在包含1000000行记录。

下面的大多数示例将基于上表。有意保持简单,专注于过程而不是表/数据的复杂性。

3、KingbaseES解释一个查询

 explain select * from test_table limit 10;

test=# explain select * from test_table limit 10;
                                QUERY PLAN
--------------------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68)
   ->  Seq Scan on test_table  (cost=0.00..17196.64 rows=785064 width=68)
(2 rows)

通过使用EXPLAIN,可以在数据库实际执行查询计划之前查看它们。将在下面的部分中了解每一个的部分,先看看另一个扩展版本的EXPLAIN调用EXPLAIN ANALYZE。

 explain analyze select * from test_table limit 10;

test=# explain analyze select * from test_table limit 10;
                                                     QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68) (actual time=0.062..0.063 rows=10 loops=1)
   ->  Seq Scan on test_table  (cost=0.00..17196.64 rows=785064 width=68) (actual time=0.060..0.061 rows=10 loops=1)
 Planning Time: 0.064 ms
 Execution Time: 0.073 ms
(4 rows)

与 不同EXPLAIN,EXPLAIN ANALYSE实际上在数据库中运行查询。这个选项对于了解计划者是否没有正确发挥其作用非常有帮助;即,从EXPLAIN和生成的计划是否存在巨大差异EXPLAIN ANALYZE。

4、什么是数据库中的缓冲区和缓存?

这里讨论一个有意义的指标BUFFERS。它解释了有多少数据来自缓存,以及有多少必须从磁盘中获取。

explain (analyze,buffers) select * from test_table limit 10 offset 20;

test=# explain (analyze,buffers) select * from test_table limit 10 offset 20;
                                                      QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.39..0.58 rows=10 width=48) (actual time=0.008..0.009 rows=10 loops=1)
   Buffers: shared hit=1
   ->  Seq Scan on test_table  (cost=0.00..19346.00 rows=1000000 width=48) (actual time=0.005..0.007 rows=30 loops=1)
         Buffers: shared hit=1
 Planning Time: 0.100 ms
 Execution Time: 0.019 ms

Buffers : shared hit=1意味着从 KingbaseES缓存本身获取了1个页面。

explain (analyze,buffers) select * from test_table limit 100 offset 500;

test=# explain (analyze,buffers) select * from test_table limit 100 offset 500;
                                                      QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
 Limit  (cost=9.67..11.61 rows=100 width=48) (actual time=0.140..0.157 rows=100 loops=1)
   Buffers: shared hit=1 read=5
   ->  Seq Scan on test_table  (cost=0.00..19346.00 rows=1000000 width=48) (actual time=0.008..0.134 rows=600 loops=1)
         Buffers: shared hit=1 read=5
 Planning Time: 0.039 ms
 Execution Time: 0.171 ms

Buffers: shared hit=1 read=5,显示5个页面来自磁盘。该read部分是显示有多少页面来自磁盘的变量,hit表示来自缓存。如果我们再次执行相同的查询(记住ANALYSE运行查询),那么所有数据现在都来自缓存。

test=# explain (analyze,buffers) select * from test_table limit 100 offset 500;
                                                      QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
 Limit  (cost=9.67..11.61 rows=100 width=48) (actual time=0.058..0.070 rows=100 loops=1)
   Buffers: shared hit=6
   ->  Seq Scan on test_table  (cost=0.00..19346.00 rows=1000000 width=48) (actual time=0.009..0.047 rows=600 loops=1)
         Buffers: shared hit=6
 Planning Time: 0.040 ms
 Execution Time: 0.084 ms
(6 rows) 

KingbaseES使用一种称为 LRU(最近最少使用)缓存的机制将经常使用的数据存储在内存中。了解到 KingbaseES 的缓存机制,可以使用EXPLAIN (ANALYSE, BUFFERS)命令查看它是如何工作的。

5、VERBOSE 命令参数

Verbose 是另一个提供额外信息的命令参数。

explain (analyze,buffers,verbose) select * from test_table limit 100 offset 500;

test=# explain (analyze,buffers,verbose) select * from test_table limit 100 offset 500;
                                                          QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=9.67..11.61 rows=100 width=48) (actual time=0.101..0.115 rows=100 loops=1)
   Output: id, code, name
   Buffers: shared hit=6
   ->  Seq Scan on public.test_table  (cost=0.00..19346.00 rows=1000000 width=48) (actual time=0.008..0.091 rows=600 loops=1)
         Output: id, code, name
         Buffers: shared hit=6
 Planning Time: 0.034 msExecution Time: 0.129 ms 

注意,Output: id, code, name是附加的。在复杂的查询计划中,将打印大量其他信息。默认情况下,COSTS and TIMING选项TRUE作为设置,除非您想将它们设置为FALSE。

6、KingbaseES中的 FORMAT 解释

KingbaseES能够以多种格式提供查询计划,例如JSON,这些计划可以用某种语言进行解析。

explain (analyze,buffers,verbose,format json) select * from test_table limit 100 offset 5000;

test=# explain (analyze,buffers,verbose,format json) select * from test_table limit 100 offset 5000;
                 QUERY PLAN
---------------------------------------------
 [                                          +
   {                                        +
     "Plan": {                              +
       "Node Type": "Limit",                +
       "Parallel Aware": false,             +
       "Startup Cost": 96.73,               +
       "Total Cost": 98.66,                 +
       "Plan Rows": 100,                    +
       "Plan Width": 48,                    +
       "Actual Startup Time": 0.802,        +
       "Actual Total Time": 0.821,          +
       "Actual Rows": 100,                  +
       "Actual Loops": 1,                   +
       "Output": ["id", "code", "name"],    +
       "Shared Hit Blocks": 6,              +
       "Shared Read Blocks": 42,            +
       "Shared Dirtied Blocks": 0,          +
       "Shared Written Blocks": 0,          +
       "Local Hit Blocks": 0,               +
       "Local Read Blocks": 0,              +
       "Local Dirtied Blocks": 0,           +
       "Local Written Blocks": 0,           +
       "Temp Read Blocks": 0,               +
       "Temp Written Blocks": 0,            +
       "Plans": [                           +
         {                                  +
           "Node Type": "Seq Scan",         +
           "Parent Relationship": "Outer",  +
           "Parallel Aware": false,         +
           "Relation Name": "test_table",   +
           "Schema": "public",              +
           "Alias": "test_table",           +
           "Startup Cost": 0.00,            +
           "Total Cost": 19346.00,          +
           "Plan Rows": 1000000,            +
           "Plan Width": 48,                +
           "Actual Startup Time": 0.006,    +
           "Actual Total Time": 0.646,      +
           "Actual Rows": 5100,             +
           "Actual Loops": 1,               +
           "Output": ["id", "code", "name"],+
           "Shared Hit Blocks": 6,          +
           "Shared Read Blocks": 42,        +
           "Shared Dirtied Blocks": 0,      +
           "Shared Written Blocks": 0,      +
           "Local Hit Blocks": 0,           +
           "Local Read Blocks": 0,          +
           "Local Dirtied Blocks": 0,       +
           "Local Written Blocks": 0,       +
           "Temp Read Blocks": 0,           +
           "Temp Written Blocks": 0         +
         }                                  +
       ]                                    +
     },                                     +
     "Planning Time": 0.058,                +
     "Triggers": [                          +
     ],                                     +
     "Execution Time": 0.835                +
   }                                        +
 ]
(1 row)

同时还支持其他格式:TEXT(默认)、JSON、XML、YAML

7、总结EXPLAIN使用方式

EXPLAIN 通常会开始使用的计划类型,主要用于生产系统。

EXPLAIN ANALYSE用于运行查询以及获取查询计划。这是获得计划中的计划时间和执行时间细分以及与执行查询的成本和实际时间的比较。

EXPLAIN (ANALYSE, BUFFERS) 在分析之上使用以获取来自缓存和磁盘的行/页数以及缓存的行为方式。

EXPLAIN (ANALYSE, BUFFERS, VERBOSE) 获取有关查询的详细信息和附加信息。

EXPLAIN(ANALYSE,BUFFERS,VERBOSE,FORMAT JSON)是以特定格式导出的方式;在这种情况下,JSON。

8、执行计划查看

查询计划的元素

无论复杂性如何,任何查询计划都有一些基本结构。在本节中,将重点关注这些结构,这将有助于以抽象的方式理解查询计划。

查询的节点

查询计划由节点组成:

一个节点可以被认为是数据库执行的一个阶段。节点大多是嵌套的,如上图所示;在Seq Scan它之前和之上完成,然后应用该Limit子句。可以添加一个Where子句来理解多层次的嵌套。

 explain select * from test_table where code = '0002222' limit 10 offset 500;

l  筛选ID > 10000 的行。

l  使用过滤器进行顺序扫描。

l  在顶部应用LIMIT条件。

如您所见,数据库识别出只需要 10 行,并且一旦达到所需的 10 行就不会再进行扫描。当前,已关闭查询并行,SET max_parallel_workers_per_gather =0; ,以便计划更简单。

查询规划器中的成本

成本是数据库查询计划的关键部分,由于它们的表示方式,这些成本很容易被误解。

 

需要注意的几个重要事项是:

l  LIMIT条款的启动成本不为零。这是因为启动成本汇总到顶部,看到的是其下方节点的成本。

l  总成本是一个衡量标准,与规划者的相关性比与用户的相关性更高。

l  通常,顺序扫描在估计方面很模糊,因为数据库不知道如何优化它们。索引可以极大地加速带有WHERE子句的查询。

l  Width很重要,因为一行越宽,需要从磁盘获取的数据就越多。

如果我们实际运行查询,那么成本会更有意义。

数据库规划和执行

计划和执行时间是仅使用EXPLAIN ANALYSE选项获得的指标。

 

Planner(Planning Time)根据各种参数决定查询应该如何运行,Executor(执行时间)运行查询。上面指出的这些参数是抽象的,适用于任何类型的查询。运行时间以毫秒表示。极少的场景,会出现Plan程序可能需要更多时间来计划查询,而执行程序需要更少时间。它们不一定需要彼此匹配,但如果它们差距很多,那么就要检查其原因了。

在典型代表在线事务处理的 OLTP 系统中,任何计划和执行的总和应该小于 50 毫秒,除非它是分析查询/大量写入/已知异常。在典型的业务中,交易通常从数千到数百万不等。应始终非常仔细地观察这些执行时间,因为这些较小的成本较高的查询可能汇总起来并增加巨大的开销。

优化查询从这里出发

已经涵盖了从查询生命周期到规划器如何做出决策的步骤,本文省略了像节点类型(扫描、排序、连接)这样的主题,因为它们交为复杂,另需文档说明。本文的目的是泛泛了解查询规划器的工作原理、影响其决策的因素以及KingbaseES 提供的工具以更好地理解规划器。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS应用API手势方法-绑定手势方法

述:为组件绑定不同类型的手势事件,并设置事件的响应方法。 Api:从API Version 7开始支持 一、绑定手势识别: 通过如下属性给组件绑定手势识别,手势识别成功后可以通过事件回调通知组件。 名称参数类型默认值描述ge…

银河麒麟V10+达梦数据库8保姆级安装教程

银河麒麟V10达梦数据库8保姆级安装教程 一、系统和数据库的下载 银河麒麟V10版本: 首页 → 桌面操作系统 → 银河麒麟桌面操作系统V10 → 试用(填写信息) → 点击地址进行下载(X86centos7) #如果不想进行上面的操作,…

Casbin——Java版本(笔记)

文章目录一、Casbin 是什么?二、快速开始2.1 载入配置2.2 如何判断权限2.3 model.conf2.3.1 基本格式2.3.2 SpringBoot下的使用2.3.3 匹配的函数内置函数自定义函数2.3.4 基于角色的访问控制角色的层次区分用户和角色隐式角色权限域内RBAC角色与函数2.3.5 优先级模型…

react事件系统(老版本)

带着问题阅读探索 React 为什么有自己的事件系统?什么是事件合成 ?如何实现的批量更新?事件系统如何模拟冒泡和捕获阶段?如何通过 dom 元素找到与之匹配的fiber?为什么不能用 return false 来阻止事件的默认行为&…

python【PyQt5】的环境搭建和使用(全网最全)其一

什么是pyQT pyqt是一个用于创建GUI应用程序的跨平台工具包,它将python与qt库融为一体。也就是说,pyqt允许使用python语言调用qt库中的API。这样做的最大好处就是在保存了qt高运行效率的同时,大大提高开发效率。因为,使用python语言…

城市路边停车收费系统/停车收费管理系统

摘 要 近年来,随着社会的进步和发展,车辆也在迅速增加,城市交通的瓶颈不仅体现在道路交通的拥挤上,也体现在传统停车场管理效率和安全性大大滞后于社会的需要,给人们的生活带来了极大的不便。尤其,随着汽车…

二、MongoDB简介及基本操作

mongodb是一个基于文档的强大、灵活、易于扩展的通用型数据库。是基于分布式文件存储的数据库。其由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 mongodb也是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富&…

运动健身买什么耳机好用、最优秀的健身耳机推荐分享

冬天绝对是个减肥的好季节,因为这个季节天气比较冷,我们在运动过程中消耗的热量也就会更多,因此选择一款不错的运动耳机来用坚持就显得尤为重要了。这款运动耳机要能稳定在耳朵上,还要具备防水功能,同时音质上也要有保…

闲人闲谈PS之三十四——项目成本费用控制阈值

**惯例闲话:**最近有小伙伴问闲人有没有PS顾问资源,闲人问了一圈,结果发现都没有档期,不免让闲人有些失落,好心答应帮忙,结果帮不上…但是隐隐约约觉得在几年前说的话被应验了,PS模块一定是个热…

Ubuntu G++ 编译C++源文件

工程项目代码简短的时候使用 G 进行功能模块测试 过程分为: 预处理:展开头文件,去掉主食,条件编译和文件包含编译:检查语法,生成汇编代码汇编:汇编代码转换成机器码链接:Link 主要是…

王学岗音视频开发(一)—————配置NDK开发环境

Android studio准备 Android studio需要下载Android6.0版本(Android SDK Platform 23),最小支持Android6.0 NDK 下载 cmake下载安装 Android studio 代理配置 dl.google.com可能会被屏蔽,首先查下其IP地址。查到IP地址后修改etc/hosts文件。 Andr…

pytorch深度学习实战lesson25

第二十五课 network in network(NIN) NIN 叫做network in network或者叫做网络中的网络。这个网络现在用的不多,几乎很少被用到。但是它里面提出了比较重要的概念,在之后很多网络都会被持续的用到。所以今天认识一下这一个网络。 目录 理论部分 实践部…

高并发下丢失更新的解决方案

作者:谢益培 1 背景 关键词:并发、丢失更新 预收款账户表上有个累计抵扣金额的字段,该字段的含义是统计商家预收款账户上累计用于抵扣结算成功的金额数。更新时机是,账单结算完成时,更新累计抵扣金额累计抵扣金额账…

ImmunoChemistry艾美捷Annexin V-FITC细胞凋亡检测试剂盒方案

膜联蛋白V是具有血管抗凝血活性的钙和磷脂结合蛋白家族的成员。体外实验结果表明,它可能通过与凝血酶原竞争磷脂酰丝氨酸(PS)结合位点而在抑制凝血中发挥作用。在健康细胞中,PS通常保存在细胞膜的内小叶(胞质侧&#x…

网络是怎样连接的--TCP大致控制流程

文章目录5.1 协议栈内部结构5.2 套接字作用5.3 创建套接字5.4 两类控制信息5.5 连接操作的实际过程5.6 收发数据5.6.1将http请求消息发给协议栈5.6.2 注意对较大数据进行拆分5.6.3 序号和ACK5.6.4 等待超时时间5.6.5 窗口机制提升效率5.6.6 ACK与窗口合并5.7 断开连接5.8 删除套…

MCE | 新冠 德尔塔病毒

冠状病毒,其表面有突出的棒状尖峰,在电镜下可以观察到像王冠一样的放射状凸起而得名。冠状病毒的基本结构如图 1 所示,包括刺突糖蛋白 (S)、包膜 (E)、膜 (M) 和核衣壳 (N)。 图 1. 冠状病毒结构2020 年石正丽教授在 Nature 发表的论文 A …

浅识JVM

⭐️前言⭐️ 本篇文章,博主分享的是在面试中JVM常考的考点,希望这篇文章能够对你有用。 🍉博客主页: 🍁【如风暖阳】🍁 🍉精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、…

多维度比对三种软件开发方式后,无代码开发到底赢在哪?

近年来受信息化、数字化和 5G、云计算发展的影响,以及企业管理的不确定性和复杂性增加,国内管理软件的需求及行业市场整体规模也连年高速增长,进而带动了管理软件开发方式的变革。 但是由于传统自主及外包开发方式存在的周期长、成本高、不能…

DataX二次开发——(9)新增s3reader和s3writer模块

1 背景 DataX3.0支持阿里的OSS的读写,但没支持S3的读写,虽然OSS的也是基于S3协议去做二开的,但是一些参数有点区别,所以按照阿里的OSSReader和OSSWriter开发了S3Reader和S3Writer。 2 代码开发 2.1 s3reader 2.1.1 项目结构 2…

pytorch快速上手(8)-----pytorch优化器简介

文章目录一、简介二、optimizer属性方法1. zero_grad()2. step()3. add_param_group()4. state_dict()5. load_state_dict()学习率动量三、常见优化器介绍1. BGD(Batch Gradient Descent)2. Stochastic Gradient Descent(SGD)3. M…