ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析

前言

在程序员或DBA的日常工作中,编写并执行SQL语句如同日常饮食中的一餐一饭,再寻常不过。然而,在使用命令行或黑屏客户端处理SQL时,常会遇到编写难、错误排查缓慢以及查询结果可读性不佳等难题,因此,图形化工具成为了我们调试与执行SQL的首选。那么,你是否曾好奇,当我们借助直观易用的开发者工具执行一条SQL语句时,从按下执行按钮的那一刻起,直至结果呈现、查询执行计划展现的过程,这条SQL语句究竟经历了怎样的旅程?倘若执行响应迟缓,又是哪个环节遭遇了瓶颈呢?

ODC 作为OceanBase的数据库开发者工具,致力于为用户提供更高效、更易用的 SQL 执行与诊断方案,在 4.1.0 版本,对 SQL 执行阶段的耗时也做了进一步的细化展示,以方便用户更清晰的了解 SQL 耗时详情。本文以 OceanBase Oracle 模式下一条 SQL 在 ODC 以及 OBServer 上的生命周期为例,介绍 ODC SQL 执行过程及耗时计算方案。

1 SQL 的执行过程

前置处理

在 SQL 被实际执行前,首先会被解析,获取其操作对象类型、是否加写锁(for update)、是否为多表查询等基础信息。之后根据解析结果,若其满足一定的条件,可能会对 SQL 进行改写操作。

Apply SQL

改写包括两点,一是为了提升查询性能,当语句为 SELECT 类型,查询字段中包含 * 且非 .* 的语句时,会尝试替换为 table.* ;二是会在 SELECT 后增加 ROWID AS __ODC_INTERNAL_ROWID__ 的字段,这是因为结果集编辑时,若查询中未指定 ROWID 字段,那么可能会出现数据误更新的情况。

SELECT * FROM DEMO;为例,在发出执行请求后,会被改写为:

SELECT ROWID AS "__ODC_INTERNAL_ROWID__", DEMO.* FROM DEMO;

Validate SQL semantics

尽管对是否改写 SQL 已经经过了一定的判定,但仍然可能出现改写后无法执行的情况,例如查询 GV$SYSSTAT 等不支持 ROWID 的系统视图,那么即便语法不存在错误,也会导致执行失败。

为了避免改写导致的执行失败,在真实执行 SQL 之前,会执行 EXPLAIN + SQL ,若执行成功则说明改写成功,执行改写后的 SQL 并返回结果,否则仍然会采用原 SQL。

SQL 执行

SQL 执行阶段是 SQL 生命周期中最主要的阶段,其经过内部处理和准备后,通过网络协议一次或多次发送至 OceanBase Server 端,由 OBServer 进行具体执行操作,之后将结果以同样的方式返回客户端。

一条 SQL 在调用 JDBC 驱动执行语句后,驱动首先会进行一系列准备,例如设置查询行数限制、判断是否通过代理连接 Server 、设置执行超时计时器 等,这个阶段记作 Jdbc prepare 。

SQL 在从客户端发送至 OceanBase Server 端后,会进入等待队列,若租户 CPU 不足或服务器负载过高,则此过程可能会耗费大量时间。结束排队后,将会对其进行解析、改写和获取 SELECT 语句的执行计划,该过程若未命中缓存,也可能占用较长时间。拿到物理执行计划后,执行器才会调用线程执行该条 SQL ,并将计划保存至缓存中。为简化理解成本,上述一系列操作合并记作 OBServer wait 阶段。

OBServer 执行完成后,将数据返回客户端,通过 Get result-set 阶段,从返回结果中解析出要展示的数据,至此,便是一条 SQL 的实际执行过程。

后置处理

在获取到执行结果后,为了客户端的展示、编辑及错误提示,还会对该条 SQL 和执行结果进行几项后置处理。

Init SQL type

针对不同类型的 SQL,Navicat、SQL Developer 等数据库开发工具一般会给出不同的结果展示方式,例如 Navicat 对于 DML(INSERT、DELETE、UPDATE)类型语句会展示 Affected rows 影响行数,而对于 DDL、DQL 等仅提示 OK 执行成功,且展示 DQL 类型的查询结果。

ODC 对 SQL 类型的结果展示逻辑与 Navicat 基本相同,而解析类型的过程即被记作 Init SQL type 阶段,具体解析工作通过 OceanBase sql-parser 工具完成。

Init column comment 与 Init editable Info

在解析完 SQL 类型后,如果执行结果包含一个或多个表的列数据,则 ODC 会从字典视图 ALL_TAB_COLUMNS 中尝试获取相关列和表信息,并将其暂存在缓存中,以供接下来获取列注释和判断结果集是否可编辑。

若当前 SQL 涉及到对表或视图对象的查询,那么在展示时会显示列注释。而且,若当前 SQL 为单表查询,那么 ODC 能够允许用户对结果集进行编辑;若为多表查询,有且只有其中一张表的 ROWID 被指定,则指定 ROWID 的表的列可编辑,其余列不可。

Init warning message

OceanBase 数据库提供了字典视图 ALL_ERRORS,用于查看当前用户可访问的存储对象的错误。由于 SQL 窗口同样可以执行 PL,因此在执行结束后,ODC 将尝试查询 ALL_ERRORS 视图,通过对象名名称、Schema 名称和对象类型进行标识。若存在错误信息,则将其结构化处理后返回给用户。

至此,SQL 和结果集的后置处理也结束了,我们通过在 执行记录 界面中的 DB 耗时,查看上述各阶段的具体耗时。

2 OBServer 上的执行时间

SQL_AUDIT 视图

OceanBase 数据库将每一次 SQL 执行的来源、执行状态、详细耗时等信息存储在 GV$SQL_AUDIT 系统视图中,您可以通过该视图来查询 SQL 在 OBServer 端的耗时详情。

SQL_AUDIT 视图相关字段如下所示:

字段名称类型描述
TRACE_IDVARCHAR2(128)该语句的 trace_id
TENANT_IDNUMBER(38)发送请求的租户 ID
REQUEST_TIMENUMBER(38)开始执行时间点,单位:微秒
ELAPSED_TIMENUMBER(38)接收到请求到执行结束所消耗的总时间
EXECUTE_TIMENUMBER(38)实际计划执行所消耗的时间

注:在 OceanBase 4.0 版本之后,GV$SQL_AUDIT 命名更改为 GV$OB_SQL_AUDIT 。该视图按照租户拆分,除了系统租户,其他租户不能跨租户查询。

SQL TRACE

此外, OceanBase 支持 Trace 功能,通过变量 OB_ENABLE_TRACE_LOG 控制。

开启该功能后,可以使用SHOW TRACE命令来快速获取最近一次 SQL 请求的完整日志。该命令获取的数据格式如下所示:

示例结果说明如下:

  • Title 列包含整个 SQL 执行经历的各个阶段的信息以及该 SQL 真实的执行路径。若结果中有经过 Resolve、Transform、Optimizer 和 Code Generate 四个流程,则说明该 SQL 重新生成了计划,没有命中 Plan Cache。
  • KeyValue 列包含一些执行信息,可以用于排查问题:
    • TRACE_ID 可以作为 SQL_AUDIT 视图中的过滤条件,快速找到该 SQL 执行信息,同时也可以通过该 TRACE_ID 快速查找相关的 OBServer 日志。
    • plan_id 可以用于在 v$plan_cache_plan_explain 中查看 Plan Cache 中缓存的具体执行计划。
    • phy_plan_type 指出该次执行计划的类型(1 表示本地计划/2 表示远程计划/3 表示分布式计划),可以辅助 SQL 诊断。
  • Time 列显示上一个阶段点到这次阶段点执行耗时。如果某个 SQL 执行很慢,则通过查看 TIME 列,能够快速定位出具体是哪个阶段执行较慢,然后再进行具体分析。假设执行耗时主要在生成计划过程中,则只需要分析没有命中 Plan Cache 的原因,可能是计划淘汰后第一次执行该 SQL,或是 Plan Cache 不支持的 SQL。

3 ODC 如何计算耗时

Jdbc 准备耗时

JDBC驱动记录了执行请求发送和接收结果的时间节点,通过api来获取 JDBC 网络开销的时间,ODC 通过调用接口获取两个关键时间戳,将其作为计算耗时的数据来源。

Jdbc prepare 阶段耗时通过计算真实发送网络请求调用执行方法之间的时间差得到。当 Server 端的查询结果较多时,会分多次网络通信返回数据,我们使用 Jdbc 记录第一个数据包接收的时间戳,用于后续计算 Network consumption 阶段的耗时。

实际执行耗时

在 SQL 执行完成后,ODC 会通过 SHOW TRACE 命令获取查询该条 SQL 在 OBServer 端的实际执行日志。通过分析计算该日志,可得到该次请求的 ELAPSED_TIME (接收到请求到执行结束消耗的总时间)和 EXECUTE_TIME (实际执行物理计划所消耗的时间)。

其中 EXECUTE_TIME 即为 OBServer Execute SQL 阶段耗时,且被展示为执行记录中做外层的 DB 耗时。解析、改写、获取执行计划等预处理操作的耗时为除 EXECUTE_TIME 之外时间之和,合并记作 OBServer wait 阶段。

网络耗时

虽然 GV$SQL_AUDIT 视图中记录了每条 SQL 执行请求的 REQUEST_TIME ,理论上可通过该时间戳与请求发送之间的时间差获取到网络延时。但实际上由于该字段取自 OBServer 本地服务器时钟,而不同服务器间的·,时钟存在时间差异,因此难以单独计算请求发送或接收的耗时。

ODC 将接收到第一个回包的时间节点与请求发送的时间节点之间的差值作为请求往返时间,并减去上一步获取到的 ELAPSED_TIME 即 OBServer 端总耗时,从而获取到请求发送与接收的总网络耗时,记作 Network consumption 阶段。

4 ODC 执行耗时展示

在 ODC 中,我们可以通过“执行记录”界面的 “DB 耗时”功能查看 SQL 执行各个阶段的耗时,进而定位问题所在。ODC 在 4.1.0 版本,将每个阶段的执行耗时时间单位进行了自适应处理,保留小数点后两位,且对 SQL 执行阶段的耗时也做了进一步的细化展示,以方便用户更清晰的了解 SQL 耗时详情。

文中的例子是在 OB-Oracle 模式下运行,OB-MySQL 模式与之相比,不会对 SQL 进行解析与改写,而是直接交由驱动和 OBServer 执行,其余阶段基本相同,因此不再赘述。

总结

SQL 的一生很长,本文仅仅是简要描述了其被 ODC 执行时,各个生命周期中的主要工作以及耗时是如何得到的,对 SQL 在 OceanBase Server 端内部的执行过程也仅是粗略介绍。

后续的文章中将会带大家了解 ODC 的权限管理模型,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为USG5500防火墙配置NAT

实验要求: 1.按照拓扑图部署网络环境,使用USG5500防火墙,将防火墙接口加入相应的区域,添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip,使trust区域…

三角波生成函数

% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒,步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…

Lc70--319.两个数组的交集(二分查找)---Java版

1.题目描述 2.思路 用集合求交集,因为集合里面的元素要满足不重复、无序、唯一。使得集合在去重、查找和集合操作(如交集、并集、差集等)中非常高效和方便。 3.代码实现 class Solution {public int[] intersection(int[] nums1, int[] nu…

操作系统实验 C++实现生产者-消费者问题

实验目的 1、进一步加深理解进程同步的概念 2、加深对进程通信的理解 3、了解Linux下共享内存的使用方法 实验内容 1、按照下面要求,写两个c程序,分别是生产者producer.c以及customer.c 2、一组生产者和一组消费者进程共享一块环形缓冲区 使用共…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息,对森林图斑进行精确区划。相较于传统手段,无人机调查具有低成本、高效率、高时效的特点,尤其在地理环境条件不好的区域,调查人员无法或难以到达的…

Android学生信息管理APP的设计与开发

1. 项目布局设计 页面1&#xff1a;学生信息添加页面 采用线性布局&#xff0c;页面中控件包含TextView、editView、Button等。 布局核心代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http…

AI(12)-飘带

1.【钢笔工具】画第一条曲线 2.【钢笔工具】画第二条曲线 3-全选两条曲线-【对象】-【混合】-【混合选项】-【指定的步数】-【15】 3-1-【对象】-【混合】-【建立】 4-双击打开【渐变工具】 4-1-【类型&#xff1a;线性】 4-2-点击切换【描边】在上方 4-3-关闭【填色】 4-4-点…

智能指针原理、使用和实现——C++11新特性(三)

目录 一、智能指针的理解 二、智能指针的类型 三、shared_ptr的原理 1.引用计数 2.循环引用问题 3.weak_ptr处理逻辑 四、shared_ptr的实现 五、定制删除器 六、源码 一、智能指针的理解 问题&#xff1a;什么是智能指针&#xff1f;为什么要有智能指针&#xff1f;智…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…

使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法

在使用uniapp开发微信小程序时候&#xff0c;过多的引入uni_modules的组件库&#xff0c;会导致主包文件过大&#xff0c;导致无法上传微信小程序&#xff0c;主包要求大小不超过1.5MB.分包大小每个不能超过2M。 解决方法&#xff1a;分包。 1.对每个除了主页面navbar的页面进…

WPF窗体基本知识-笔记-命名空间

窗体程序关闭方式 命名空间:可以理解命名空间的作用为引用下面的控件对象 给控件命名:一般都用x:Name,也可以用Name但是有的控件不支持 布局控件(容器)的类型 布局控件继承于Panel的控件,其中下面的border不是布局控件,panel是抽象类 在重叠的情况下,Zindex值越大的就在上面 Z…

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件&#xff1a;USBToSerialPort.apk 链接&#xff1a;https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码&#xff1a;8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args 目录…

使用IDEA+Maven实现MapReduced的WordCount

使用IDEAMaven实现MapReduce 准备工作 在桌面创建文件wordfile1.txt I love Spark I love Hadoop在桌面创建文件wordfile2.txt Hadoop is good Spark is fast上传文件到Hadoop # 启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh # 删除HDFS的hadoop对应的input和out…

Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

1. Ribbon 介绍 Ribbon 是什么 &#xff1f; 1.Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端&#xff0c;负载均衡的工具 2.Ribbon 主要功能是提供客户端负载均衡算法和服务调用 3.Ribbon 客户端组件提供一系列完善的配置项如“连接超时&#xff0c;重试” 4…

TSMC12nm工艺数字IC后端实现难点都有哪些?

大家知道咱们社区近期TSMC 12nm ARM Cortexa-A72(1P9M 6Track Metal Stack)即将开班。这里小编要强调一点:不要认为跑了先进工艺的项目就会很有竞争力&#xff01;如果你仅仅是跑个先进工艺的flow&#xff0c;不懂先进工艺在数字IC后端实现上的不同点&#xff0c;为何有这样的不…

使用微信小程序调用飞桨PaddleX平台自行训练的模型——微信小程序用训练的牡丹花模型Demo测试

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【C++】基础篇二、引用详解

文章目录 1.引用的概念和定义2.引用的特性3.引用的使用3.1 做函数返回值3.2 传参 3.3 其他使用 4.const的运用引用的权限问题&#xff1b;const修饰引用&#xff1b; 5.指针和引用的对比 1.引用的概念和定义 在介绍概念之前先说一下引用的符号——“ & ”&#xff1b;对于这…

D3基础:绘制圆形、椭圆形、多边形、线、路径、矩形

在D3.js中&#xff0c;可以通过SVG元素来创建各种几何图形。以下是D3.js中常用的几何图形及其简单的创建方法&#xff1a; 1. 圆形 (Circle) 圆形是最基本的形状之一&#xff0c;可以通过<circle>标签来创建。 <!DOCTYPE html> <html> <head><met…

前端监控之sourcemap精准定位和还原错误源码

一、概述 在前端开发中&#xff0c;监控和错误追踪是确保应用稳定性和用户体验的重要环节。 随着前端应用的复杂性增加&#xff0c;JavaScript错误监控变得尤为重要。在生产环境中&#xff0c;为了优化加载速度和性能&#xff0c;前端代码通常会被压缩和混淆。这虽然提升了性…