OBCP第三章 SQL引擎高级技术-执行计划

简介: OBCP第三章 SQL引擎高级技术-执行计划

SQL 是一种“描述型”语言。与“过程型”语言不同,用户在使用 SQL 时,只描述了“要做什么”,而不是“怎么做”


数据库在接收到SQL查询时,必须为其生成一个“执行计划”。OceanBase的执行计划本质上是由物理操作符构成的一棵执行树


执行树从形状上可以分为“左深树”、“右深树”和“多枝树”三种(参见下图)。OceanBase的优化器在生成连接顺序时主要考虑左深树的连接形式。

执行计划展示

通过Explain命令查看优化器针对给定SQL生成的逻辑执行计划

Explain不会真正执行给定的SQL,可以放心使用该功能而不用担心在性能调试中可能给系统性能带来影响

Explain命令格式如下例所示,展示格式包括 BASIC、EXTENDED、PARTITIONS 等等,内容的详细程度有所区别

EXPLAIN [BASIC | EXTENDED | PARTITIONS | FORMAT = format_name] explainable_stmt
format_name: 
{ TRADITIONAL | JSON }
explainable_stmt: 
{ SELECT statement 
| DELETE statement 
| INSERT statement 
| REPLACE statement 
| UPDATE statement }

执行计划展示(EXPLAIN)-计划形状与算子信息

Explain输出的第一部分是执行计划的树形结构展示。其中每一个操作在树中的层次通过其在OPERATOR中的缩进予以展示:


执行计划展示(EXPLAIN)-计划形状与算子信息

执行计划各列含义

列名 含义
ID 执行树按照前序遍历的方式得到的编 号(从0开始)
OPERATOR 操作算子的名称
NAME 对应表操作的表名(索引名)
EST. ROWS 估算的该操作算子的输出行数
COST 该操作算子的执行代价(微秒)

常见的算子

类型 算子

表访问 table scan, table get

连接 NESTED-LOOP, BLK-NESTED-LOOP, Merge、hash

排序 sort,top-n sort

聚合 merge group-by,hash group-by, window function

分布式 exchange in/out remote/distribute

集合 union, except, intersect,minus

其他 limit, material, subplan, expression, count

执行计划展示(EXPLAIN)-操作算子详细输出

Explain输出的第二部分是各操作算子的详细信息,包括输出表达式、过滤条件、分区信息以及各算子的独有信息,包括排序键、连接键、下压条件等等:

Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), sort_keys([t1.c1, ASC], 
[t1.c2, ASC]), prefix_pos(1)
1 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
equal_conds([t1.c1 = t2.c2]), other_conds(nil)
2 - output([t2.c1], [t2.c2]), filter(nil), sort_keys([t2.c2, ASC])
3 - output([t2.c2], [t2.c1]), filter(nil),access([t2.c2], [t2.c1]), partitions(p0)
4 - output([t1.c1], [t1.c2]), filter(nil),access([t1.c1], [t1.c2]), partitions(p0)

执行计划展示-示例

如下示例可以看出要访问的表为IDX_a这张索引表,表的主键为(c2,c1),扫描的范围是全表扫描。


实时执行计划展示

实时执行计划展示可以展示 SQL 的物理执行计划。而使用Explain命令,可以展示出当前优化器所生成的执行计划,


但该SQL在计划缓存中实际对应的计划可能与Explain的结果并不相同,造成这种现象的原因有很多,诸如统计信息变化、用户session变量设置变化等等。为了确定该SQL在系统中实际使用的执行计划,有时还需要进一步分析计划


缓存中的物理执行计划。


OceanBase 数据库每个服务器的计划缓存都是独立的 。 用户可以通过查询(g)v$plan_cache_plan_explain这张虚拟表来展示某条SQL在计划缓存中的执行计划。其中有几个注意点:


(g)v$plan_cache_plan_explain这张虚拟表展示的计划为物理执行计划,在算子命名上会与 EXPLAIN 所展示的逻辑执行计划有所不同


如果访问v$plan_cache_plan_explain,必须给定tenant_id和plan_id的值,否则系统将返回空集


如果访问gv$plan_cache_plan_explain,必须给定ip、port、tenant_id、plan_id这四列的值,否则系统将返回空集

实时执行计划展示

首先通过(g)v$plan_cache_plan_stat虚拟表查询到SQL 在计划缓存中对应的plan_id

实时执行计划展示

通过查询(g)v$plan_cache_plan_explain这张虚拟表来展示某条SQL在计划缓存中的执行计划


EXPLAIN与实时执行计划的对比

EXPLAIN命令的输出逻辑执行计划:


v$plan_cache_plan_explain输出的实时执行计划:



查看执行计划的几种其它方式

EXPLAIN|DESCRIBE|DESC方式查看执行计划

{EXPLAIN | DESCRIBE | DESC} 
[BASIC | OUTLINE | EXTENDED | EXTENDED_NOADDR | PARTITIONS | FORMAT = {TRADITIONAL| 
JSON}] 
{SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE 
statement}

通过SQL Trace查看执行过程信息及各阶段的耗时

SET ob_enable_trace_log = 1;
SHOW TRACE;

通过v$sql_audit查看每一次SQL请求的来源、执行状态等统计信息

select * from v$sql_audit;
相关文章
|
6天前
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。
|
1月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
47 1
|
1月前
|
SQL 安全 数据库
sql注入技术
sql注入技术
|
2月前
|
SQL 机器学习/深度学习 自然语言处理
Text-to-SQL技术演进 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法剖析
本文主要介绍了阿里云OpenSearch在Text-to-SQL任务中的最新进展和技术细节。
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
113 0
|
3月前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
21 0
|
3月前
|
SQL 数据挖掘 数据库
SQL中的重复行删除:技术与策略
【8月更文挑战第31天】
97 0
|
3月前
|
SQL 数据管理 关系型数据库
SQL分区表技术的奥秘:如何用分区策略让你的大规模数据飞起来?
【8月更文挑战第31天】在现代软件开发中,处理大规模数据是常见挑战,而SQL分区表技术提供了一种高效的解决方案。本文详细介绍了SQL分区表的概念、类型(范围、列表、哈希和键分区)及其创建与维护方法,并通过示例代码展示了如何添加、删除和重组分区。遵循了解查询模式、定期维护分区及使用数据库性能工具等最佳实践,可以帮助开发者更高效地进行数据管理。随着SQL生态的发展,分区表技术将在未来发挥更大作用。
34 0
|
4月前
|
SQL 分布式计算 MaxCompute
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
|
4月前
|
SQL 缓存 测试技术
DeepMind的新论文,长上下文的大语言模型能否取代RAG或者SQL这样的传统技术呢?
DeepMind的LOFT基准测试挑战了长上下文大型语言模型(LCLLMs)的效用,包括Gemini、GPT-4o和Claude 3 Opus。
83 1