开发指南—DAL语句—EXPLAIN

简介: 该语句用于解释SQL语句的执行计划,包括SELECT、DELETE、INSERT、REPLACE或UPDATE语句。

语法

获取SQL计划信息:


EXPLAIN
{LOGICALVIEW | LOGIC | SIMPLE | DETAIL | EXECUTE | PHYSICAL | OPTIMIZER | SHARDING
 | COST | ANALYZE | BASELINE | JSON_PLAN | ADVISOR} 
 {SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE statement}

示例

  • explain语句:展示基本的SQL执行计划,该执行计划是算子组成,主要体现SQL在CN上的整个执行过程。
mysql> explain select count(*) from lineitem group by L_ORDERKEY;

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Project(count()="count()") |
| HashAgg(group="L_ORDERKEY", count()="SUM(count())") |
| Gather(concurrent=true) |
| LogicalView(tables="[000000-000003].lineitem_[00-15]", shardCount=16, sql="SELECT `L_ORDERKEY`, COUNT() AS `count()` FROM `lineitem` AS `lineitem` GROUP BY `L_ORDERKEY`") |
| HitCache:false | |
| TemplateId: 5819c807 |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  • 其中,HitCache标记该查询是否命中PlanCache,取值为false or trueTemplateId表示对该计划的标识,具有全局唯一性。
  • explain logicalview语句:展示LogicalView所表示的下推SQL在DN上的执行计划。
mysql> explain LOGICALVIEW select  mysql> explain select logialview count(*) from lineitem group by L_ORDERKEY;
+----------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+----------------------------------------------------------+
| Project(count()="count()") |
| HashAgg(group="L_ORDERKEY", count()="SUM(count())") |
| Gather(concurrent=true) |
| LogicalView |
| MysqlAgg(group="L_ORDERKEY", count(*)="COUNT()") |
| MysqlTableScan(name=[ads, lineitem]) |
| HitCache:true |
| Source:PLAN_CACHE |
| TemplateId: 5819c807
  • explain execute语句:表示下推SQL在mysql的执行情况,这个语句和mysql的explain语句同义。通过该语句可以查看下推SQL在DN上有没有使用索引,有没有做全表扫描。
mysql> explain EXECUTE  select  count(*) from lineitem group by L_ORDERKEY;
+----+-------------+----------+------------+-------+---------------+---------+---------+-----+------+----------+----------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+---------+---------+-----+------+----------+----------------------------------------------+
| 1 | SIMPLE | lineitem | NULL | index | PRIMARY | PRIMARY | 8 | NULL | 1 | 100 | Using index; Using temporary; Using filesort |
+----+-------------+----------+------------+-------+---------------+---------+---------+-----+------+----------+----------------------------------------------+
1 row in set (0.24 sec)
  • explain sharding语句:展示当前查询在DN上扫描的物理分片情况。
mysql> explain sharding  select  count(*) from lineitem group by L_ORDERKEY;
+---------------+----------------------------------+-------------+-----------+-----------+
| LOGICAL_TABLE | SHARDING | SHARD_COUNT | BROADCAST | CONDITION |
+---------------+----------------------------------+-------------+-----------+-----------+
| lineitem | [000000-000003].lineitem_[00-15] | 16 | false | |
+---------------+----------------------------------+-------------+-----------+-----------+
1 row in set (0.04 sec)
  • explain cost语句:相对于explain语句,除了展示执行计划以外,还会显示各个算子基于统计信息估算的代价,以及这条查询被优化器识别的WORKLOAD。
mysql> explain COST  select  count(*) from lineitem group by L_ORDERKEY;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Project(count()="count()"): rowcount = 2508.0, cumulative cost = value = 2.4867663E7, cpu = 112574.0, memory = 88984.0, io = 201.0, net = 4.75, id = 182 |
| HashAgg(group="L_ORDERKEY", count()="SUM(count())"): rowcount = 2508.0, cumulative cost = value = 2.4867662E7, cpu = 112573.0, memory = 88984.0, io = 201.0, net = 4.75, id = 180 |
| Gather(concurrent=true): rowcount = 2508.0, cumulative cost = value = 2.4860069E7, cpu = 105039.0, memory = 29796.0, io = 201.0, net = 4.75, id = 178 |
| LogicalView(tables="[000000-000003].lineitem_[00-15]", shardCount=16, sql="SELECT `L_ORDERKEY`, COUNT() AS `count()` FROM `lineitem` AS `lineitem` GROUP BY `L_ORDERKEY`"): rowcount = 2508.0, cumulative cost = value = 2.4860068E7, cpu = 105038.0, memory = 29796.0, io = 201.0, net = 4.75, id = 109 |
| HitCache:true |
| Source:PLAN_CACHE |
| WorkloadType: TP |
| TemplateId: 5819c807
  • explain analyze语句:相对于explain cost语句,除了显示各个算子基于统计信息估算的代价以外,该语句可以收集真实运行过程中算子输出的rowCount等信息。
mysql> explain ANALYZE  select  count(*) from lineitem group by L_ORDERKEY;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Project(count()="count()"): rowcount = 2508.0, cumulative cost = value = 2.4867663E7, cpu = 112574.0, memory = 88984.0, io = 201.0, net = 4.75, actual time = 0.001 + 0.000, actual rowcount = 2506, actual memory = 0, instances = 1, id = 182 |
| HashAgg(group="L_ORDERKEY", count()="SUM(count())"): rowcount = 2508.0, cumulative cost = value = 2.4867662E7, cpu = 112573.0, memory = 88984.0, io = 201.0, net = 4.75, actual time = 0.000 + 0.000, actual rowcount = 2506, actual memory = 0, instances = 1, id = 180 |
| Gather(concurrent=true): rowcount = 2508.0, cumulative cost = value = 2.4860069E7, cpu = 105039.0, memory = 29796.0, io = 201.0, net = 4.75, actual time = 0.000 + 0.000, actual rowcount = 0, actual memory = 0, instances = 0, id = 178 |
| LogicalView(tables="[000000-000003].lineitem_[00-15]", shardCount=16, sql="SELECT `L_ORDERKEY`, COUNT() AS `count()` FROM `lineitem` AS `lineitem` GROUP BY `L_ORDERKEY`"): rowcount = 2508.0, cumulative cost = value = 2.4860068E7, cpu = 105038.0, memory = 29796.0, io = 201.0, net = 4.75, actual time = 0.030 + 0.025, actual rowcount = 10000, actual memory = 0, instances = 0, id = 109 |
| HitCache:true |
| Source:PLAN_CACHE |
| TemplateId: 5819c807 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
7 rows in set (1.08 sec)
  • explain physical语句:展示查询在运行过程中执行模式、各个执行片段(Fragment)的依赖关系和并行度。该查询被识别为单机单线程计划模式(TP_LOCAL),执行计划被分为三个片段Fragment-0、Fragment-1和Fragment-2,先做预聚合再做最终的聚合计算,每个片段的执行度可以不同。
mysql> explain physical   select  count(*) from lineitem group by L_ORDERKEY;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ExecutorMode: TP_LOCAL |
| Fragment 0 dependency: [] parallelism: 4 |
| Gather(concurrent=true) |
| LogicalView(tables="[000000-000003].lineitem_[00-15]", shardCount=16, sql="SELECT `L_ORDERKEY`, COUNT() AS `count()` FROM `lineitem` AS `lineitem` GROUP BY `L_ORDERKEY`") |
| Fragment 1 dependency: [] parallelism: 8 |
| LocalBuffer |
| RemoteSource(sourceFragmentIds=[0], type=RecordType(INTEGER L_ORDERKEY, BIGINT count(*))) |
| Fragment 2 dependency: [0, 1] parallelism: 8 |
| Project(count()="count()") |
| HashAgg(group="L_ORDERKEY", count()="SUM(count())") |
| RemoteSource(sourceFragmentIds=[1], type=RecordType(INTEGER L_ORDERKEY, BIGINT count(*))) |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
11 rows in set (0.10 sec)
  • explain advisor语句:主要是会基于统计信息,分析当前查询的执行计划,给用户推荐可以加速查询的全局二级索引。
mysql> explain advisor   select  count(*) from lineitem group by L_ORDERKEY \G;
1. row **
IMPROVE_VALUE: 4.4%
IMPROVE_CPU: 340.8%
IMPROVE_MEM: 0.0%
IMPROVE_IO: 1910.0%
IMPROVE_NET: 0.0%
BEFORE_VALUE: 2.48676627E7
BEFORE_CPU: 112573.7
BEFORE_MEM: 88983.8
BEFORE_IO: 201
BEFORE_NET: 4.7
AFTER_VALUE: 2.38256249E7
AFTER_CPU: 25536
AFTER_MEM: 88983.8
AFTER_IO: 10
AFTER_NET: 4.7
ADVISE_INDEX: ALTER TABLE `ads`.`lineitem` ADD GLOBAL INDEX `__advise_index_gsi_lineitem_L_ORDERKEY`(`L_ORDERKEY`) DBPARTITION BY HASH(`L_ORDERKEY`) TBPARTITION BY HASH(`L_ORDERKEY`) TBPARTITIONS 4;
NEW_PLAN:
Project(count()="count()")
HashAgg(group="L_ORDERKEY", count()="SUM(count())")
Gather(concurrent=true)
IndexScan(tables="[000000-000003].lineitem__what_if_gsi_L_ORDERKEY_[00-15]", shardCount=16, sql="SELECT `L_ORDERKEY`, COUNT() AS `count()` FROM `lineitem__what_if_gsi_L_ORDERKEY` AS `lineitem__what_if_gsi_L_ORDERKEY` GROUP BY `L_ORDERKEY`")
INFO: GLOBAL_INDEX
1 row in set (0.13 sec)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
运维 监控 Linux
Linux运维工程师笔试题系列1(30题)
Linux运维工程师笔试题系列1(30题) 如果您对问题有疑问,或者认为答案不准确的,欢迎留言交流。 问题如下: 1. Linux下,为某个脚本赋予可执行权限() A chmod +x filename.sh B chown +x filename.sh C chmod +r filename.sh D chown +r filename.sh 2. Linux文件系统的目录结构是一棵倒挂的树,文件都按其作用分门别类地放在相关的目录中。
3629 0
|
人工智能 Rust 前端开发
前端界的未来趋势:掌握这些新技术,让你的作品走在时代前沿!
【10月更文挑战第30天】前端开发正以前所未有的速度发展,新技术层出不穷。本文探讨了AI助手(如GitHub Copilot)、低代码/无代码平台、跨平台技术(如React Native)和WebAssembly等未来主流技术,并附上示例代码,帮助你走在时代前沿。
559 1
|
搜索推荐 数据挖掘 API
抖音商品详情API接口对电商的作用及收益
在电商快速发展的背景下,抖音作为全球领先的短视频平台,凭借其庞大的用户基础和高活跃度,通过商品详情API接口为电商行业开辟了新渠道。本文深入解析了抖音商品详情API接口的功能及其对电商的积极作用,包括商品信息实时同步、提升用户体验、精准营销、数据分析与优化等方面,展示了该接口如何帮助电商企业拓展销售渠道、优化商品策略、提升用户满意度、促进跨界合作与开发创新商业模式,为电商企业带来显著收益。同时,文章也探讨了实现这些收益的关键步骤及面临的挑战,强调了数据安全与隐私保护的重要性,以及创新和差异化竞争的必要性。
396 4
|
缓存 安全 数据安全/隐私保护
「小邓观点」分享几种常见的账户锁定原因
下期小邓将与大家分享账户锁定的解决方案。如果您有账户锁定方面的困扰,敬请期待!
1030 4
|
物联网 Linux Android开发
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
本文通过具体案例介绍了如何使用微软的开源框架 Uno Platform 实现与 IoT 设备的集成。Uno Platform 支持一次编写、多平台部署,适用于 Windows、macOS、Linux、WebAssembly 及 iOS/Android。本例创建了一个控制网络 LED 灯的应用,详细说明了环境搭建、MQTT 客户端配置、主题订阅及控制指令发送等步骤。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
493 0
Linux 命令 `bg`:将作业放到后台执行
`bg` 命令在 Linux 中用于将挂起的作业放到后台执行,允许同时处理多个任务。通过 `Ctrl + Z` 暂停作业,然后使用 `bg`(可指定作业编号)使其继续后台运行。配合 `jobs` 查看后台作业状态,`fg` 将作业带回前台,`kill` 结束作业。这些工具帮助用户更高效地管理终端作业。
|
数据采集 人工智能 数据处理
上手体验华为AI平台ModelArts
小白上手体验华为AI平台ModelArts
888 0
上手体验华为AI平台ModelArts
蓝桥杯之单片机学习(五)——独立按键的基本操作与扩展应用
蓝桥杯之单片机学习(五)——独立按键的基本操作与扩展应用
473 0
蓝桥杯之单片机学习(五)——独立按键的基本操作与扩展应用
|
数据采集 云安全 安全
DDos防护、Web应用防火墙 与 云防火墙 有什么区别?
《云计算小白学习云产品》:云安全产品介绍