查询分析

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
所有文档
menu
没有找到结果,请重新输入

数据仓库 PALO

  • 功能发布记录
  • 操作手册1
    • LDAP认证
    • 时区
    • 使用S3-SDK访问对象存储
    • 权限管理
    • 物化视图
    • 变量
    • 资源管理
    • 数据更新与删除
      • 标记删除
      • Sequence-Column
      • 数据更新
      • 数据删除
    • 备份与恢复
      • 备份与恢复
    • 数据导出1
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 数据导出概述
      • Export
    • 数据导出
      • 全量数据导出
      • 导出查询结果集
      • 导出总览
      • 导出数据到外部表
    • 查询加速1
      • 查询缓存
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
    • 数据导入
      • JSON格式数据导入说明
      • 导入本地数据
      • 导入BOS中的数据
      • 导入事务和原子性
      • 通过外部表同步数据
      • 使用JDBC同步数据
      • 列的映射、转换与过滤
      • 订阅Kafka日志
      • 严格模式
      • 导入总览
    • 数据更新与删除1
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 数据导入1
      • 高并发导入优化(Group Commit)
      • 导入概览
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 数据源
        • Kafka
        • S3 兼容存储
        • 从其他 TP 系统迁移数据
        • HDFS
        • 从其他 AP 系统迁移数据
        • Flink
        • 本地文件
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
  • 开发指南
    • 迁移ClickHouse数据
    • Doris集群间数据迁移
    • 数据更新与删除
      • 事务
      • 数据更新
        • 主键模型的导入更新
        • 主键模型的 Update 更新
        • 数据更新概述
        • 主键模型的更新并发控制
        • 聚合模型的导入更新
      • 数据删除
        • 删除操作概述
        • Truncate 操作
        • 表原子替换
        • Delete 操作
        • 基于导入的批量删除
        • 临时分区
    • 查询加速
      • 查询缓存
      • Colocation Join
      • 高并发点查
      • Hint
        • Hint 概述
        • Leading Hint
        • Distribute Hint
      • 物化视图
        • 同步物化视图
        • 物化视图概览
        • 异步物化视图
          • 异步物化视图常见问题
          • 最佳实践
          • 异步物化视图概述
          • 创建、查询与维护异步物化视图
      • 高效去重
        • BITMAP 精准去重
        • HLL 近似去重
      • 优化技术原理
        • TOPN 查询优化
        • 统计信息
        • Pipeline 执行引擎
        • 查询优化器介绍
        • Runtime Filter
      • 查询调优概述
        • 调优概述
        • 诊断工具
        • 分析工具
        • 调优流程
      • 查询优化实践
        • 常见调优参数
        • 计划调优
          • 使用 Hint 控制代价改写
          • 使用异步物化视图透明改写
          • 使用 Leading Hint 控制 Join 顺序
          • 优化表 Schema 设计
          • 使用分区裁剪优化扫表
          • 优化索引设计和使用
          • 使用 Hint 调整 Join Shuffle 方式
          • DML 计划调优
          • 使用 Colocate Group 优化 Join
          • 使用同步物化视图透明改写
          • 使用 SQL Cache 加速查询
        • 执行调优
          • 数据倾斜处理
          • RuntimeFilter 的等待时间调整
          • 并行度调优
    • 数据查询
      • 连接(JOIN)
      • 子查询
      • 复杂类型查询
      • 列转行 (Lateral View)
      • MySQL 兼容性
      • 聚合多维分析
      • 分析函数(窗口函数)
      • 公用表表达式(CTE)
      • 自定义函数
        • 别名函数
        • Java UDF, UDAF, UDTF
    • 数据导出
      • SELECT INTO OUTFILE
      • MySQL Dump
      • 最佳实践
      • 数据导出概述
      • Export
    • 数据导入
      • 高并发导入优化(Group Commit)
      • 异常数据处理
      • 导入高可用性
      • 导入时实现数据转换
      • 导入最佳实践
      • 数据源
        • Kafka
        • Snowflake
        • S3 兼容存储
        • Google Cloud Storage
        • 从其他 TP 系统迁移数据
        • Azure Storage
        • 腾讯云 COS
        • MinIO
        • HDFS
        • 阿里云 OSS
        • 华为云 OBS
        • 从其他 AP 系统迁移数据
        • Flink
        • Redshift
        • Amazon S3
        • 本地文件
        • BigQuery
      • 导入方式
        • Broker Load
        • MySQL Load
        • Insert Into Values
        • Stream Load
        • Insert Into Select
        • Routine Load
      • 文件格式
        • CSV
        • JSON
        • Parquet
        • ORC
      • 复杂数据类型
        • MAP
        • Variant
        • JSON
        • STRUCT
        • Bitmap
        • HLL
        • ARRAY
    • BI工具接入
      • Sugar
      • Navicat
      • Tableau
      • DBeaver
      • 永洪BI
      • FineBI(帆软)
    • 数据库连接
      • 通过 MySQL 协议连接
      • 基于 Arrow Flight SQL 的高速数据传输链路
    • 湖仓一体
      • 分析 S3或HDFS 上的文件
      • 湖仓一体概述
      • SQL 方言兼容
      • 弹性计算节点
      • 云服务认证接入
      • 元数据缓存
      • 外表统计信息
      • 数据缓存
      • 数据库分析
        • MySQL
        • JDBC Catalog
        • Oracle
        • OceanBase
        • SAP HANA
        • 阿里云 MaxCompute
        • ClickHouse
        • PostgreSQL
        • IBM Db2
        • SQL Server
        • Elasticsearch
      • 湖仓一体最佳实践
        • 使用 PALO 和 Paimon
        • 使用 PALO 和 Iceberg
        • 使用 PALO 和 Hudi
        • 使用 PALO 和 LakeSoul
      • 数据湖构建
        • Iceberg
        • Hive
      • 数据湖分析
        • Hudi Catalog
        • 阿里云 DLF
        • Iceberg Catalog
        • Paimon Catalog
        • Hive Catalog
    • 数据表设计
      • 行业混存
      • 数据压缩
      • Schema 变更
      • 数据类型
      • 自增列
      • 概览
      • 数据库建表最佳实践
      • 冷热数据分层
        • SSD 和 HDD 层级存储
        • 远程存储
        • 冷热数据分层概述
      • 表索引
        • 倒排索引
        • 前缀索引与排序键
        • N-Gram 索引
        • BloomFilter 索引
        • 索引概述
      • 数据划分
        • 数据分桶
        • 数据分布概念
        • 动态分区
        • 自动分区
        • 手动分区
        • 常见文档
      • 数据模型
        • 使用注意
        • 模型概述
        • 主键模型
        • 明细模型
        • 聚合模型
  • 版本发布历史
    • 百度数据仓库 Palo 2.0 版本全新发布
  • SQL手册
    • 字面常量
    • 别名
    • SQL-手册
    • 数据类型
    • SQL语句
    • 注释
    • 内置函数
    • 白名单管理
    • SQL操作符
    • 内置函数
      • 聚合函数
      • 位操作函数
      • 字符串函数
      • 条件函数
      • 数学函数
      • JSON解析函数
      • 类型转换函数
      • 格式转换函数
      • 通用函数
      • 时间和日期函数
      • BITMAP函数
      • 窗口函数
      • 哈希函数
      • HLL函数
    • 语法帮助
      • DML
        • INSERT
        • ROUTINE-LOAD
        • RESTORE
        • SELECT-INTO-OUTFILE
        • ALTER-ROUTINE-LOAD
        • BROKER-LOAD
        • BACKUP
        • EXPORT
        • STREAM-LOAD
      • DDL
        • CREATE-FILE
        • DROP-RESOURCE
        • CREATE-RESOURCE
        • CREATE-MATERIALIZED-VIEW
        • DROP-RESROUCE
        • CREATE-TABLE
        • DROP-REPOSITORY
        • CREATE-REPOSITORY
        • CREATE-ODBC-TABLE
      • 信息查看语句
        • SHOW-BACKUP
        • SHOW-ALTER-TABLE-MATERIALIZED-VIEW
        • SHOW-SNAPSHOT
        • SHOW-ROUTINE-LOAD
        • SHOW-CREATE-ROUTINE-LOAD
        • SHOW-ROLES
        • SHOW-GRANTS
        • SHOW-EXPORT
        • SHOW-ROUTINE-LOAD-TASK
        • SHOW-REPOSITORIES
        • SHOW-LOAD
        • SHOW-RESOURCES
        • SHOW-RESTORE
        • SHOW-PROPERTY
        • SHOW-FILE
      • 辅助命令
        • PAUSE-ROUTINE-LOAD
        • STOP-ROUTINE-LOAD
        • ALTER-ROUTINE-LOAD
        • CANCEL-LOAD
        • RESUME-ROUTINE-LOAD
      • 账户管理
        • SET-PROPERTY
        • REVOKE
        • GRANT
        • CREATE-ROLE
        • DROP-ROLE
        • CREATE-USER
        • DROP-USER
        • SET-PASSWORD
  • 快速入门
    • 快速上手
    • 存算分离
    • 存算一体
  • 典型实践
    • 如何开启Debug日志
    • 导入分析
    • 查询分析
  • 操作手册
    • 权限和子用户
    • 存算一体
      • 连接集群
      • 查询分析
      • 监控告警
        • 监控指标
        • 告警配置
      • 备份恢复
        • 通过管理页面备份与恢复
        • 备份与恢复
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 集群创建
        • 停止与删除
        • 重置管理员密码
        • 集群扩缩容
        • 集群详情
    • 存算分离
      • 连接集群
      • 计算组管理
        • 重启计算组
        • 创建计算组
      • 监控告警
        • 监控指标
        • 告警配置
      • 权限管理
        • 集群权限
        • 控制台权限
      • 集群管理
        • 停止与删除
        • 创建集群
        • 重置管理员密码
        • 集群详情
  • 服务等级协议SLA
    • 服务等级协议(SLA)v1.0
  • 产品概述
    • 系统架构
    • 产品特点
    • 产品介绍
  • 视频专区
    • 操作指南
    • 产品简介
  • 产品定价
    • 预付费
    • 计费说明
    • 后付费
  • 文档中心
  • arrow
  • 数据仓库PALO
  • arrow
  • 典型实践
  • arrow
  • 查询分析
本页目录
  • 查询分析
  • 查询计划树
  • 查看查询计划
  • 查看查询 Profile

查询分析

更新时间:2025-08-21

查询分析

PALO 提供了一个图形化的命令以帮助用户更方便的分析一个具体的查询或导入。本文介绍如何使用该功能。

查询计划树

SQL 是一个描述性语言,用户通过一个 SQL 来描述想获取的数据。而一个 SQL 的具体执行方式依赖于数据库的实现。而查询规划器就是用来决定数据库如何具体执行一个 SQL 的。

比如用户指定了一个 Join 算子,则查询规划器需要决定具体的 Join 算法,比如是 Hash Join,还是 Merge Sort Join;是使用 Shuffle 还是 Broadcast;Join 顺序是否需要调整以避免笛卡尔积;以及确定最终的在哪些节点执行等等。

PALO 的查询规划过程是先将一个 SQL 语句转换成一个单机执行计划树。

Plain Text
1     ┌────┐
2     │Sort│
3     └────┘
4        │
5  ┌───────────┐
6  │Aggregation│
7  └───────────┘
8        │
9     ┌────┐
10     │Join│
11     └────┘
12    ┌───┴────┐
13┌──────┐ ┌──────┐
14│Scan-1│ │Scan-2│
15└──────┘ └──────┘

之后,查询规划器会根据具体的算子执行方式、数据的具体分布,将单机查询计划转换为分布式查询计划。分布式查询计划是由多个 Fragment 组成的,每个 Fragment 负责查询计划的一部分,各个 Fragment 之间会通过 ExchangeNode 算子进行数据的传输。

Plain Text
1        ┌────┐
2        │Sort│
3        │F1  │
4        └────┘
5           │
6     ┌───────────┐
7     │Aggregation│
8     │F1         │
9     └───────────┘
10           │
11        ┌────┐
12        │Join│
13        │F1  │
14        └────┘
15    ┌──────┴────┐
16┌──────┐ ┌────────────┐
17│Scan-1│ │ExchangeNode│
18│F1    │ │F1          │
19└──────┘ └────────────┘
20                │
21          ┌──────────────┐
22          │DataStreamDink│
23          │F2            │
24          └──────────────┘
25                │
26            ┌──────┐
27            │Scan-2│
28            │F2    │
29            └──────┘

如上图,我们将单机计划分成了两个 Fragment:F1 和 F2。两个 Fragment 之间通过一个 ExchangeNode 节点传输数据。

而一个 Fragment 会进一步的划分为多个 Instance。Instance 是最终具体的执行实例。划分成多个 Instance 有助于充分利用机器资源,提升一个 Fragment 的执行并发度。

查看查询计划

可以通过以下两种命令查看一个 SQL 的执行计划。

  • EXPLAIN GRAPH select ...;
  • EXPLAIN select ...;

其中第一个命令以图形化的方式展示一个查询计划,这个命令可以比较直观的展示查询计划的树形结构,以及 Fragment 的划分情况:

Plain Text
1mysql> desc graph select tbl1.k1, sum(tbl1.k2) from tbl1 join tbl2 on tbl1.k1 = tbl2.k1 group by tbl1.k1 order by tbl1.k1;
2+---------------------------------------------------------------------------------------------------------------------------------+
3| Explain String                                                                                                                  |
4+---------------------------------------------------------------------------------------------------------------------------------+
5|                                                                                                                                 |
6|              ┌───────────────┐                                                                                                  |
7|              │[9: ResultSink]│                                                                                                  |
8|              │[Fragment: 4]  │                                                                                                  |
9|              │RESULT SINK    │                                                                                                  |
10|              └───────────────┘                                                                                                  |
11|                      │                                                                                                          |
12|           ┌─────────────────────┐                                                                                               |
13|           │[9: MERGING-EXCHANGE]│                                                                                               |
14|           │[Fragment: 4]        │                                                                                               |
15|           └─────────────────────┘                                                                                               |
16|                      │                                                                                                          |
17|            ┌───────────────────┐                                                                                                |
18|            │[9: DataStreamSink]│                                                                                                |
19|            │[Fragment: 3]      │                                                                                                |
20|            │STREAM DATA SINK   │                                                                                                |
21|            │  EXCHANGE ID: 09  │                                                                                                |
22|            │  UNPARTITIONED    │                                                                                                |
23|            └───────────────────┘                                                                                                |
24|                      │                                                                                                          |
25|               ┌─────────────┐                                                                                                   |
26|               │[4: TOP-N]   │                                                                                                   |
27|               │[Fragment: 3]│                                                                                                   |
28|               └─────────────┘                                                                                                   |
29|                      │                                                                                                          |
30|      ┌───────────────────────────────┐                                                                                          |
31|      │[8: AGGREGATE (merge finalize)]│                                                                                          |
32|      │[Fragment: 3]                  │                                                                                          |
33|      └───────────────────────────────┘                                                                                          |
34|                      │                                                                                                          |
35|               ┌─────────────┐                                                                                                   |
36|               │[7: EXCHANGE]│                                                                                                   |
37|               │[Fragment: 3]│                                                                                                   |
38|               └─────────────┘                                                                                                   |
39|                      │                                                                                                          |
40|            ┌───────────────────┐                                                                                                |
41|            │[7: DataStreamSink]│                                                                                                |
42|            │[Fragment: 2]      │                                                                                                |
43|            │STREAM DATA SINK   │                                                                                                |
44|            │  EXCHANGE ID: 07  │                                                                                                |
45|            │  HASH_PARTITIONED │                                                                                                |
46|            └───────────────────┘                                                                                                |
47|                      │                                                                                                          |
48|     ┌─────────────────────────────────┐                                                                                         |
49|     │[3: AGGREGATE (update serialize)]│                                                                                         |
50|     │[Fragment: 2]                    │                                                                                         |
51|     │STREAMING                        │                                                                                         |
52|     └─────────────────────────────────┘                                                                                         |
53|                      │                                                                                                          |
54|     ┌─────────────────────────────────┐                                                                                         |
55|     │[2: HASH JOIN]                   │                                                                                         |
56|     │[Fragment: 2]                    │                                                                                         |
57|     │join op: INNER JOIN (PARTITIONED)│                                                                                         |
58|     └─────────────────────────────────┘                                                                                         |
59|           ┌──────────┴──────────┐                                                                                               |
60|    ┌─────────────┐       ┌─────────────┐                                                                                        |
61|    │[5: EXCHANGE]│       │[6: EXCHANGE]│                                                                                        |
62|    │[Fragment: 2]│       │[Fragment: 2]│                                                                                        |
63|    └─────────────┘       └─────────────┘                                                                                        |
64|           │                     │                                                                                               |
65| ┌───────────────────┐ ┌───────────────────┐                                                                                     |
66| │[5: DataStreamSink]│ │[6: DataStreamSink]│                                                                                     |
67| │[Fragment: 0]      │ │[Fragment: 1]      │                                                                                     |
68| │STREAM DATA SINK   │ │STREAM DATA SINK   │                                                                                     |
69| │  EXCHANGE ID: 05  │ │  EXCHANGE ID: 06  │                                                                                     |
70| │  HASH_PARTITIONED │ │  HASH_PARTITIONED │                                                                                     |
71| └───────────────────┘ └───────────────────┘                                                                                     |
72|           │                     │                                                                                               |
73|  ┌─────────────────┐   ┌─────────────────┐                                                                                      |
74|  │[0: OlapScanNode]│   │[1: OlapScanNode]│                                                                                      |
75|  │[Fragment: 0]    │   │[Fragment: 1]    │                                                                                      |
76|  │TABLE: tbl1      │   │TABLE: tbl2      │                                                                                      |
77|  └─────────────────┘   └─────────────────┘                                                                                      |
78+---------------------------------------------------------------------------------------------------------------------------------+

从图中可以看出,查询计划树被分为了5个 Fragment:0、1、2、3、4。如 OlapScanNode 节点上的 [Fragment: 0] 表示这个节点属于 Fragment 0。每个Fragment之间都通过 DataStreamSink 和 ExchangeNode 进行数据传输。

图形命令仅展示简化后的节点信息,如果需要查看更具体的节点信息,如下推到节点上的过滤条件等,则需要通过第二个命令查看更详细的文字版信息:

Plain Text
1mysql> explain select tbl1.k1, sum(tbl1.k2) from tbl1 join tbl2 on tbl1.k1 = tbl2.k1 group by tbl1.k1 order by tbl1.k1;
2+----------------------------------------------------------------------------------+
3| Explain String                                                                   |
4+----------------------------------------------------------------------------------+
5| PLAN FRAGMENT 0                                                                  |
6|  OUTPUT EXPRS:<slot 5> <slot 3> `tbl1`.`k1` | <slot 6> <slot 4> sum(`tbl1`.`k2`) |
7|   PARTITION: UNPARTITIONED                                                       |
8|                                                                                  |
9|   RESULT SINK                                                                    |
10|                                                                                  |
11|   9:MERGING-EXCHANGE                                                             |
12|      limit: 65535                                                                |
13|                                                                                  |
14| PLAN FRAGMENT 1                                                                  |
15|  OUTPUT EXPRS:                                                                   |
16|   PARTITION: HASH_PARTITIONED: <slot 3> `tbl1`.`k1`                              |
17|                                                                                  |
18|   STREAM DATA SINK                                                               |
19|     EXCHANGE ID: 09                                                              |
20|     UNPARTITIONED                                                                |
21|                                                                                  |
22|   4:TOP-N                                                                        |
23|   |  order by: <slot 5> <slot 3> `tbl1`.`k1` ASC                                 |
24|   |  offset: 0                                                                   |
25|   |  limit: 65535                                                                |
26|   |                                                                              |
27|   8:AGGREGATE (merge finalize)                                                   |
28|   |  output: sum(<slot 4> sum(`tbl1`.`k2`))                                      |
29|   |  group by: <slot 3> `tbl1`.`k1`                                              |
30|   |  cardinality=-1                                                              |
31|   |                                                                              |
32|   7:EXCHANGE                                                                     |
33|                                                                                  |
34| PLAN FRAGMENT 2                                                                  |
35|  OUTPUT EXPRS:                                                                   |
36|   PARTITION: HASH_PARTITIONED: `tbl1`.`k1`                                       |
37|                                                                                  |
38|   STREAM DATA SINK                                                               |
39|     EXCHANGE ID: 07                                                              |
40|     HASH_PARTITIONED: <slot 3> `tbl1`.`k1`                                       |
41|                                                                                  |
42|   3:AGGREGATE (update serialize)                                                 |
43|   |  STREAMING                                                                   |
44|   |  output: sum(`tbl1`.`k2`)                                                    |
45|   |  group by: `tbl1`.`k1`                                                       |
46|   |  cardinality=-1                                                              |
47|   |                                                                              |
48|   2:HASH JOIN                                                                    |
49|   |  join op: INNER JOIN (PARTITIONED)                                           |
50|   |  runtime filter: false                                                       |
51|   |  hash predicates:                                                            |
52|   |  colocate: false, reason: table not in the same group                        |
53|   |  equal join conjunct: `tbl1`.`k1` = `tbl2`.`k1`                              |
54|   |  cardinality=2                                                               |
55|   |                                                                              |
56|   |----6:EXCHANGE                                                                |
57|   |                                                                              |
58|   5:EXCHANGE                                                                     |
59|                                                                                  |
60| PLAN FRAGMENT 3                                                                  |
61|  OUTPUT EXPRS:                                                                   |
62|   PARTITION: RANDOM                                                              |
63|                                                                                  |
64|   STREAM DATA SINK                                                               |
65|     EXCHANGE ID: 06                                                              |
66|     HASH_PARTITIONED: `tbl2`.`k1`                                                |
67|                                                                                  |
68|   1:OlapScanNode                                                                 |
69|      TABLE: tbl2                                                                 |
70|      PREAGGREGATION: ON                                                          |
71|      partitions=1/1                                                              |
72|      rollup: tbl2                                                                |
73|      tabletRatio=3/3                                                             |
74|      tabletList=105104776,105104780,105104784                                    |
75|      cardinality=1                                                               |
76|      avgRowSize=4.0                                                              |
77|      numNodes=6                                                                  |
78|                                                                                  |
79| PLAN FRAGMENT 4                                                                  |
80|  OUTPUT EXPRS:                                                                   |
81|   PARTITION: RANDOM                                                              |
82|                                                                                  |
83|   STREAM DATA SINK                                                               |
84|     EXCHANGE ID: 05                                                              |
85|     HASH_PARTITIONED: `tbl1`.`k1`                                                |
86|                                                                                  |
87|   0:OlapScanNode                                                                 |
88|      TABLE: tbl1                                                                 |
89|      PREAGGREGATION: ON                                                          |
90|      partitions=1/1                                                              |
91|      rollup: tbl1                                                                |
92|      tabletRatio=3/3                                                             |
93|      tabletList=105104752,105104763,105104767                                    |
94|      cardinality=2                                                               |
95|      avgRowSize=8.0                                                              |
96|      numNodes=6                                                                  |
97+----------------------------------------------------------------------------------+

查询计划中显示的信息还在不断规范和完善中,我们将在后续的文章中详细介绍。

查看查询 Profile

用户可以通过以下命令打开会话变量 is_report_success:

SET is_report_success=true;

然后执行查询,则 PALO 会产生该查询的一个 Profile。Profile 包含了一个查询各个节点的具体执行情况,有助于我们分析查询瓶颈。

执行完查询后,我们可以通过如下命令先获取 Profile 列表:

Plain Text
1mysql> show query profile "/"\G
2*************************** 1. row ***************************
3   QueryId: c257c52f93e149ee-ace8ac14e8c9fef9
4      User: root
5 DefaultDb: default_cluster:db1
6       SQL: select tbl1.k1, sum(tbl1.k2) from tbl1 join tbl2 on tbl1.k1 = tbl2.k1 group by tbl1.k1 order by tbl1.k1
7 QueryType: Query
8 StartTime: 2021-04-08 11:30:50
9   EndTime: 2021-04-08 11:30:50
10 TotalTime: 9ms
11QueryState: EOF

这个命令会列出当前保存的所有 Profile。每行对应一个查询。我们可以选择我们想看的 Profile 对应的 QueryId,查看具体情况。

查看一个Profile分为3个步骤:

  1. 查看整体执行计划树

    这一步主要用于从整体分析执行计划,并查看每个Fragment的执行耗时。

    Plain Text
    1mysql> show query profile "/c257c52f93e149ee-ace8ac14e8c9fef9"\G
    2*************************** 1. row ***************************
    3Fragments:
    4             ┌──────────────────────┐
    5             │[-1: DataBufferSender]│
    6             │Fragment: 0           │
    7             │MaxActiveTime: 6.626ms│
    8             └──────────────────────┘
    9                         │
    10               ┌──────────────────┐
    11               │[9: EXCHANGE_NODE]│
    12               │Fragment: 0       │
    13               └──────────────────┘
    14                         │
    15             ┌──────────────────────┐
    16             │[9: DataStreamSender] │
    17             │Fragment: 1           │
    18             │MaxActiveTime: 5.449ms│
    19             └──────────────────────┘
    20                         │
    21                 ┌──────────────┐
    22                 │[4: SORT_NODE]│
    23                 │Fragment: 1   │
    24                 └──────────────┘
    25                        ┌┘
    26             ┌─────────────────────┐
    27             │[8: AGGREGATION_NODE]│
    28             │Fragment: 1          │
    29             └─────────────────────┘
    30                        └┐
    31               ┌──────────────────┐
    32               │[7: EXCHANGE_NODE]│
    33               │Fragment: 1       │
    34               └──────────────────┘
    35                         │
    36             ┌──────────────────────┐
    37             │[7: DataStreamSender] │
    38             │Fragment: 2           │
    39             │MaxActiveTime: 3.505ms│
    40             └──────────────────────┘
    41                        ┌┘
    42             ┌─────────────────────┐
    43             │[3: AGGREGATION_NODE]│
    44             │Fragment: 2          │
    45             └─────────────────────┘
    46                        │
    47              ┌───────────────────┐
    48              │[2: HASH_JOIN_NODE]│
    49              │Fragment: 2        │
    50              └───────────────────┘
    51           ┌────────────┴────────────┐
    52 ┌──────────────────┐      ┌──────────────────┐
    53 │[5: EXCHANGE_NODE]│      │[6: EXCHANGE_NODE]│
    54 │Fragment: 2       │      │Fragment: 2       │
    55 └──────────────────┘      └──────────────────┘
    56           │                         │
    57┌─────────────────────┐ ┌────────────────────────┐
    58│[5: DataStreamSender]│ │[6: DataStreamSender]   │
    59│Fragment: 4          │ │Fragment: 3             │
    60│MaxActiveTime: 1.87ms│ │MaxActiveTime: 636.767us│
    61└─────────────────────┘ └────────────────────────┘
    62           │                        ┌┘
    63 ┌───────────────────┐    ┌───────────────────┐
    64 │[0: OLAP_SCAN_NODE]│    │[1: OLAP_SCAN_NODE]│
    65 │Fragment: 4        │    │Fragment: 3        │
    66 └───────────────────┘    └───────────────────┘
    67           │                        │
    68    ┌─────────────┐          ┌─────────────┐
    69    │[OlapScanner]│          │[OlapScanner]│
    70    │Fragment: 4  │          │Fragment: 3  │
    71    └─────────────┘          └─────────────┘
    72           │                        │
    73  ┌─────────────────┐      ┌─────────────────┐
    74  │[SegmentIterator]│      │[SegmentIterator]│
    75  │Fragment: 4      │      │Fragment: 3      │
    76  └─────────────────┘      └─────────────────┘
    77
    781 row in set (0.02 sec)

    如上图,每个节点都标注了自己所属的 Fragment,并且在每个 Fragment 的 Sender节点,标注了该 Fragment 的执行耗时。这个耗时,是Fragment下所有 Instance 执行耗时中最长的一个。这个有助于我们从整体角度发现最耗时的 Fragment。

  2. 查看具体 Fragment 下的 Instance 列表

    比如我们发现 Fragment 1 耗时最长,则可以继续查看 Fragment 1 的 Instance 列表:

    Plain Text
    1mysql> show query profile "/c257c52f93e149ee-ace8ac14e8c9fef9/1";
    2+-----------------------------------+-------------------+------------+
    3| Instances                         | Host              | ActiveTime |
    4+-----------------------------------+-------------------+------------+
    5| c257c52f93e149ee-ace8ac14e8c9ff03 | 10.200.00.01:9060 | 5.449ms    |
    6| c257c52f93e149ee-ace8ac14e8c9ff05 | 10.200.00.02:9060 | 5.367ms    |
    7| c257c52f93e149ee-ace8ac14e8c9ff04 | 10.200.00.03:9060 | 5.358ms    |
    8+-----------------------------------+-------------------+------------+  

    这里展示了 Fragment 1 上所有的 3 个 Instance 所在的执行节点和耗时。

  3. 查看具体 Instance

    我们可以继续查看某一个具体的 Instance 上各个算子的详细 Profile:

    Plain Text
    1mysql> show query profile "/c257c52f93e149ee-ace8ac14e8c9fef9/1/c257c52f93e149ee-ace8ac14e8c9ff03"\G
    2*************************** 1. row ***************************
    3Instance:
    4 ┌───────────────────────────────────────┐
    5 │[9: DataStreamSender]                  │
    6 │(Active: 37.222us, non-child: 0.40)    │
    7 │  - Counters:                          │
    8 │      - BytesSent: 0.00                │
    9 │      - IgnoreRows: 0                  │
    10 │      - OverallThroughput: 0.0 /sec    │
    11 │      - PeakMemoryUsage: 8.00 KB       │
    12 │      - SerializeBatchTime: 0ns        │
    13 │      - UncompressedRowBatchSize: 0.00 │
    14 └───────────────────────────────────────┘
    15                     └┐
    16                      │
    17    ┌──────────────────────────────────┐
    18    │[4: SORT_NODE]                    │
    19    │(Active: 5.421ms, non-child: 0.71)│
    20    │  - Counters:                     │
    21    │      - PeakMemoryUsage: 12.00 KB │
    22    │      - RowsReturned: 0           │
    23    │      - RowsReturnedRate: 0       │
    24    └──────────────────────────────────┘
    25                     ┌┘
    26                     │
    27   ┌───────────────────────────────────┐
    28   │[8: AGGREGATION_NODE]              │
    29   │(Active: 5.355ms, non-child: 10.68)│
    30   │  - Counters:                      │
    31   │      - BuildTime: 3.701us         │
    32   │      - GetResultsTime: 0ns        │
    33   │      - HTResize: 0                │
    34   │      - HTResizeTime: 1.211us      │
    35   │      - HashBuckets: 0             │
    36   │      - HashCollisions: 0          │
    37   │      - HashFailedProbe: 0         │
    38   │      - HashFilledBuckets: 0       │
    39   │      - HashProbe: 0               │
    40   │      - HashTravelLength: 0        │
    41   │      - LargestPartitionPercent: 0 │
    42   │      - MaxPartitionLevel: 0       │
    43   │      - NumRepartitions: 0         │
    44   │      - PartitionsCreated: 16      │
    45   │      - PeakMemoryUsage: 34.02 MB  │
    46   │      - RowsProcessed: 0           │
    47   │      - RowsRepartitioned: 0       │
    48   │      - RowsReturned: 0            │
    49   │      - RowsReturnedRate: 0        │
    50   │      - SpilledPartitions: 0       │
    51   └───────────────────────────────────┘
    52                     └┐
    53                      │
    54┌──────────────────────────────────────────┐
    55│[7: EXCHANGE_NODE]                        │
    56│(Active: 4.360ms, non-child: 46.84)       │
    57│  - Counters:                             │
    58│      - BytesReceived: 0.00               │
    59│      - ConvertRowBatchTime: 387ns        │
    60│      - DataArrivalWaitTime: 4.357ms      │
    61│      - DeserializeRowBatchTimer: 0ns     │
    62│      - FirstBatchArrivalWaitTime: 4.356ms│
    63│      - PeakMemoryUsage: 0.00             │
    64│      - RowsReturned: 0                   │
    65│      - RowsReturnedRate: 0               │
    66│      - SendersBlockedTotalTimer(*): 0ns  │
    67└──────────────────────────────────────────┘

    上图展示了 Fragment 1 中,Instance c257c52f93e149ee-ace8ac14e8c9ff03 的各个算子的具体 Profile。

通过以上3个步骤,我们可以逐步排查一个SQL的性能瓶颈。

上一篇
导入分析
下一篇
操作手册