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

相关文章

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核