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

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I