签到成功

知道了

CNDBA社区CNDBA社区

OceanBase SQL请求执行流程 及 时间查看(SQL Trace)

2023-07-05 17:33 1151 0 原创 OceanBase
作者: dave

1 SQL请求执行流程(直连 OBServer)

同其他数据库一样,OB 的 SQL 在执行时也有一个固定的流程,如下:

1.1 Parser(词法/语法解析模块)

在收到用户发送的SQL请求串后,Parser会将字符串分成一个个的“单词”,并根据预先设定好的语法规则解析整个请求,将SQL请求字符串转换成带有语法结构信息的内存数据结构,称为“语法树”(Syntax Tree)。http://www.cndba.cn/dave/article/131406

1.2 Resolver(语义解析模块)

当SQL请求字符串经过语法、词法解析,生成“语法树”之后,resolver会进一步将该语法树转换为带有数据库语义信息的内部数据结构。
在这一过程中,resolver将根据数据库元信息将SQL请求中的token翻译成对应的对象(例如库、表、列、索引等),生成的数据结构叫做Statement Tree(语句树)。http://www.cndba.cn/dave/article/131406

1.3 Transformer(逻辑改写模块)

在查询优化中,经常利用等价改写的方式,将用户SQL转换为与之等价的另一条SQL,以便于优化器为之生成最佳的执行计划,这一过程称为“查询改写”。http://www.cndba.cn/dave/article/131406

Transformer 在 resolver 之 后 , 分析用户SQL的语义,并根据内部的规则或代价模型,将用户SQL“改写”为与之等价的其他形式,并将其提供给后续的优化器做进一步的优化。

1.4 Optimizer(优化器)

优化器是整个SQL请求优化的核心,其作用是为SQL请求生成最佳的执行计划。

在优化过程中,优化器需要综合考虑SQL请求的语义、对象数据特征、对象物理分布等多方面因素,解决访问路径选择、连接顺序选择、连接算法选择、分布式计划生成等多个核心问题,最终选择一个对应该SQL的最佳执行计划。

为了充分利用OceanBase的分布式架构和多核计算资源的优势,OceanBase的查询优化器会对执行计划做并行优化:根据计划树上各个节点的数据分布,对串行执行计划进行自底向上的分析,把串行的逻辑执行计划改造成一个可以并行执行的逻辑计划。

1.5 Code Generator(代码生成器)

优化器负责生成最佳的执行计划,但其输出的结果并不能立即执行,还需要通过代码生成器将其转换为可执行的代码,这个过程由Code Generator负责。

Code Generator执行的过程只是忠实地将优化器的生成结果翻译成可执行代码,并不做任何优化选择。

1.6 Executor(执行器)

对于本地执行作业,Executor会简单的从执行计划的顶端的算子开始调用,由算子自身的逻辑完成整个执行的过程,并返回执行结果。

对于远程或分布式作业,Executor需要根据预选的划分,将执行树分成多个可以调度的job,并通过RPC将其发送给相关的节点执行。

1.7 Plan Cache(执行计划缓存模块)

一次完整的语法解析、语义分析、查询改写、查询优化、代码生成的SQL编译流程称为一次“硬解析”,硬解析生成执行计划的过程比较耗时(一般为毫秒级),尤其是在OLTP场景中,这个耗时往往不可忽略。http://www.cndba.cn/dave/article/131406

http://www.cndba.cn/dave/article/131406

为了加速SQL请求的处理过程,SQL执行引擎会将SQL第一次生成的执行计划缓存在内存中,后续对该SQL的重复执行可以复用这个计划,避免了重复查询优化的过程。http://www.cndba.cn/dave/article/131406

OceanBase通过计划缓存(Plan Cache)来避免SQL硬解析。

2 SQL请求执行流程(通过OBProxy)

OBProxy 包含简单SQL Parser 功能,可进行轻量SQL解析,即先从客户端发出的 SQL 语句解析出数据库名和表名,再根据用户的租户名、数据库名、表名以及分区 ID 信息等信息,向 OBServer 拉取表分区的路由表。

http://www.cndba.cn/dave/article/131406

http://www.cndba.cn/dave/article/131406
http://www.cndba.cn/dave/article/131406

3 查看各阶段时间

SQL TRACE 能够交互式的提供上一次执行的 SQL 请求执行过程信息及各阶段的耗时。当 SQL TRACE 功能开启后,在客户端运行需要诊断的 SQL,然后通过 SHOW TRACE 语句能够查看该 SQL 执行的信息。

SQL TRACE 功能的正常使用会受另外两个配置项 enable_sql_audit 和 enable_perf_event 设置的影响。只有当两个参数均设置为开启时,SQL TRACE 功能才能正常使用。

其中,enable_sql_audit 用于设置是否开启 SQL 审计功能,默认为 True(开启)。enable_perf_event 用于设置是否开启性能事件的信息收集功能,默认为 True(开启)。

obclient [oceanbase]> show parameters like '%enable_sql_audit%'/G
*************************** 1. row ***************************
      zone: zone3
  svr_type: observer
    svr_ip: 192.168.1.23
  svr_port: 2882
      name: enable_sql_audit
 data_type: NULL
     value: True
      info: specifies whether SQL audit is turned on. The default value is TRUE. Value: TRUE: turned on FALSE: turned off
   section: OBSERVER
     scope: CLUSTER
    source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
……
obclient [oceanbase]> show parameters like '%enable_perf_event%'/G
*************************** 1. row ***************************
      zone: zone3
  svr_type: observer
    svr_ip: 192.168.1.23
  svr_port: 2882
      name: enable_perf_event
 data_type: NULL
     value: True
      info: specifies whether to enable perf event feature. The default value is True.
   section: OBSERVER
     scope: CLUSTER
    source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
……

SQL TRACE 默认是关闭的,在 OB 4.0 之前,可以通过系统变量 ob_enable_trace_log 设置是否开启 SQL TRACE 功能,取值 1 表示开启 SQL TRACE,取值 0 表示关闭 SQL TRACE。

在 OB 4.x 中,修改为通过设置ob_enable_show_trace 变量值均为 ON 来启用,如下:

obclient [oceanbase]> SHOW VARIABLES LIKE 'ob_enable_show_trace';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| ob_enable_show_trace | OFF   |
+----------------------+-------+
1 row in set (0.002 sec)

obclient [oceanbase]> SET ob_enable_show_trace='ON';
Query OK, 0 rows affected (0.000 sec)

obclient [oceanbase]> SHOW VARIABLES LIKE 'ob_enable_show_trace';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| ob_enable_show_trace | ON    |
+----------------------+-------+
1 row in set (0.000 sec)

在 OB 4.x 中可以看到 SQL 的执行信息如下:

obclient [backup]> select count(1) from bmsql_item;
+----------+
| count(1) |
+----------+
|   100000 |
+----------+
1 row in set (0.002 sec)

obclient [backup]> show trace;
+-------------------------------------------+----------------------------+------------+
| Operation                                 | StartTime                  | ElapseTime |
+-------------------------------------------+----------------------------+------------+
| com_query_process                         | 2023-07-05 17:23:53.624305 | 1.547 ms   |
| └── mpquery_single_stmt                   | 2023-07-05 17:23:53.624312 | 1.533 ms   |
|     ├── sql_compile                       | 2023-07-05 17:23:53.624323 | 1.030 ms   |
|     │   ├── pc_get_plan                   | 2023-07-05 17:23:53.624324 | 0.004 ms   |
|     │   └── hard_parse                    | 2023-07-05 17:23:53.624359 | 0.988 ms   |
|     │       ├── parse                     | 2023-07-05 17:23:53.624360 | 0.036 ms   |
|     │       ├── resolve                   | 2023-07-05 17:23:53.624409 | 0.133 ms   |
|     │       ├── rewrite                   | 2023-07-05 17:23:53.624568 | 0.281 ms   |
|     │       ├── optimize                  | 2023-07-05 17:23:53.624857 | 0.317 ms   |
|     │       ├── code_generate             | 2023-07-05 17:23:53.625184 | 0.061 ms   |
|     │       └── pc_add_plan               | 2023-07-05 17:23:53.625308 | 0.032 ms   |
|     └── sql_execute                       | 2023-07-05 17:23:53.625360 | 0.458 ms   |
|         ├── open                          | 2023-07-05 17:23:53.625361 | 0.015 ms   |
|         ├── response_result               | 2023-07-05 17:23:53.625382 | 0.395 ms   |
|         │   └── do_local_das_task         | 2023-07-05 17:23:53.625386 | 0.024 ms   |
|         └── close                         | 2023-07-05 17:23:53.625785 | 0.028 ms   |
|             ├── close_das_task            | 2023-07-05 17:23:53.625786 | 0.010 ms   |
|             └── end_transaction           | 2023-07-05 17:23:53.625804 | 0.002 ms   |
+-------------------------------------------+----------------------------+------------+
18 rows in set (0.004 sec)

obclient [backup]>

在 OB 4.x 之前的版本,格式如下:
http://www.cndba.cn/dave/article/131406

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:7970078次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ