热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KingbaseES查询计划剖析

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

概述:了解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 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 提供的工具以更好地理解规划器。


KingbaseES 查询计划剖析的相关教程结束。



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 1Oracle三层权限体系【复习】1、Oracle的权限体系划分为三个层次 ... [详细]
  • 我有一个带有H2数据库的springboot应用程序。该应用程序会在启动时引导数据库,为此,我在 ... [详细]
  • button进阶1.等级3的时候学习了用Grid(网格)布局排列。这次是button背景的引用学习圆角button。我发现学代码难的原因就是英语不好不懂什么意思。设置focysable属性为 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • MySQL锁--(深入浅出读书笔记)
    MySQL锁的概述1.针对不同的引擎,采用不同的锁机制;(表锁,页面锁,行锁)myisam和memory存储引擎:表级锁;BOB存储引擎:页面锁,表级 ... [详细]
  • Problemexplanation: ... [详细]
author-avatar
销销销hdbuaj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有