AWS Redshift 查询的执行计划(1)

2024-03-23 01:48

本文主要是介绍AWS Redshift 查询的执行计划(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,需要了解一条查询在 Redshift 中所执行的步骤。

  1. 领导节点接收查询并解析 SQL。、

  2. 分析程序生成初步查询树,后者是原始查询的逻辑表示。然后,Amazon Redshift 将该查询树输入到查询优化程序中。

  3. 优化器会评估,如有必要,请重新写入查询以最大程度提高效率。这个过程有时会导致创建多个相关查询来替换单个。

  4. 优化程序生成查询计划(或若干以上步骤,如果上一步导致执行多个查询),则执行最佳性能。查询计划指定执行选项,例如联接类型、联合订单、聚合选项和数据分发要求。

  5. 执行引擎将查询计划转换为 steps, segments 和 streams:
    步骤
    每个步骤都是在查询执行期间需要的单独操作。可以组合步骤,以允许计算节点执行查询、加入或其他数据库操作。

    可通过单个过程完成的几个步骤的组合,也可以通过计算节点层执行最小的编译单元。A slice 是并行处理的单位 Amazon Redshift. 并行运行的流中的段。

    在可用计算节点切片上划分的分段集合。
    执行引擎基于步骤、段和流生成编译后的代码。编译代码的执行速度比解释代码更快,而且计算容量更少。此编译代码然后播放到计算节点。

  6. 计算节点层以并行方式执行查询段。在该流程中,Amazon Redshift 利用优化的网络通信、内存和磁盘管理,将中间结果从一个查询计划步骤传递到下一个,这也有助于加快查询的执行。

下面看一下 AWS Redshift 文档中的流程图。
AWS Redshift 文档中的图


我们可以通过 Explain 查看查询的执行计划. 这部分内容与PG类似。
Query Plan 中的信息:

  • 成本 - 对比计划内运行的相对值。
  • 行数 - 要返回的预估行数。
  • Width - 平均行的估计宽度(字节)。

成本代表执行每一个步骤时,所花费的成本。那么数值时如何算出来的呢?
处理每行记录花费的代价,默认为 0.01
每次索引查询进入索引处理的代价,默认为 0.005
设置计划程序是对查询期间执行的每个运算符或函数的处理成本的估计。 默认值为0.0025。

testdb=# explain select * from test_even_01
;QUERY PLAN
------------------------------------------------------------------------------XN Seq Scan on test_even_01  (cost=0.00..0.10 rows=10 width=172)----- Tables missing statistics: test_even_01 ---------- Update statistics by running the ANALYZE command on these tables -----
(3 rows)testdb=# analyze test_even_01;
ANALYZE
testdb=# explain select * from test_even_01;QUERY PLAN
-----------------------------------------------------------------XN Seq Scan on test_even_01  (cost=0.00..0.10 rows=10 width=11)
(1 row)

Explain 中常见的操作, 很多内容同 PG 类似。

  1. Sequential scan operator

  2. Join operators
    (1) Nested Loop
    (2) Hash Join and Hash
    (3) Merge Join

  3. Aggregate operators
    (1) Aggregate
    (2) HashAggregate
    (3) GroupAggregate

  4. Sort operators
    (1) Sort
    (2) Merge

  5. UNION, INTERSECT, and EXCEPT operators
    (1) Subquery
    (2) Hash Intersect Distinct
    (3) SetOp Except

  6. Other operators
    (1) Unique
    (2) Limit
    (3) Window
    (4) Result
    (5) Subplan
    (6) Network
    (7) Materialize


DS_BCAST_INNER

  • 整个内部表被广播到所有节点

DS_DIST_ALL_NONE
不需要重新分配,因为表的分配方式为 ALL,已经存在在每个节点。

DS_DIST_NONE
没有表被重新分配,在没有在节点之间移动数据的情况下联接了相应的片。

DS_DIST_INNER
内部表被重新分配。

DS_DIST_OUTER
外部表被重新分配。

DS_DIST_ALL_INNER
由于外部表使用分配方式为ALL, 所以整个内部表都重新分配给单个片。

DS_DIST_BOTH
两个表都被重新分配


影响查询性能的因素

  1. Number of nodes, processors, or slices
  2. Node types
  3. Data distribution
  4. Data sort order
  5. Dataset size
  6. Concurrent operations
  7. Query structure
  8. Code compilation

这篇关于AWS Redshift 查询的执行计划(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836759

相关文章

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推