全部产品

如何查看 SQL 性能

本篇教程介绍在 OceanBase 开发者中心(OceanBase Developer Center,ODC)中查看 SQL 性能的详细步骤。

背景信息

SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,大多数数据库开发者依赖 SQL 语言对数据库内容进行管理与开发。所以 SQL 的性能一定程度上会影响数据库的性能,SQL 本身提供了执行计划命令(EXPLAIN 命令 )供用户查看语句在数据库中具体的执行步骤并以此作为判断 SQL 性能和改进 SQL 语句的依据。

OceanBase 开发者中心(OceanBase Developer Center,ODC)作为一款强大的企业级数据库开发平台,提供了图形化查看 SQL 语句执行计划的功能。借助 ODC 您可以更直观便捷查看 SQL 语句的执行情况并分析 SQL 语句的性能。

前提条件

运行下述语句,创建示例表 employees:

CREATE TABLE employees(
    emp_id INTEGER,
    emp_name VARCHAR(20),
    manager_id INTEGER
);

INSERT INTO employees VALUES ( 1, 'Anna', 6 ) ;
INSERT INTO employees VALUES ( 2, 'Brain', 4 ) ;
INSERT INTO employees VALUES ( 3, 'Candy', 4 ) ;
INSERT INTO employees VALUES ( 4, 'David', 5 ) ;
INSERT INTO employees VALUES ( 5, 'Eva', NULL) ;
INSERT INTO employees VALUES ( 6, 'Frank', 5 ) ;
INSERT INTO employees VALUES ( 7, 'Gary', 6 ) ;

操作步骤

  1. 进入连接后,在 SQL 窗口的编辑区中输入下述 ​SELECT​ 命令查看表 employees 中的数据。

    SELECT * FROM employees;
  1. 单击编辑区工具栏右上角的 计划 按钮。

    在运行命令前,可以先通过编辑区中的 计划 按钮,查看当前编辑区选中的或当前光标所在的 SQL 语句在执行前系统预估的执行计划(EXPLAIN PLAN 操作的结果),展示的执行数据可能与实际执行语句后的数据略有不用,但是可以使用该功能预先评估 SQL 语句。

  2. 在弹出的 计划详情 面板中,查看 SQL 运行前预估的执行计划。

    计划详请 面板中的 计划统计 页签会展示以下信息:

    • 算子:常见算子包含表访问(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)。

    • 名称:该算子涉及的对象名称。

    • 预估行:该算子向上输出的记录数,越大说明情况越不理想。

    • 代价:花费的代价,越大说明情况越不理想。

    • 输出过滤(附加信息):目前只有 TABLE SCAN 算子有这部分内容,该部分会提供一些更详细的信息。

  1. 运行语句。

    单击工具栏中的 运行 按钮,执行 ​SELECT​ 语句。

  2. 在结果集的工具栏中单击 计划 按钮查看执行后的执行计划。

    此时在弹出的 执行详情 中,展示的是语句执行后实际的执行计划。

  3. 执行详情 面板查看语句的 基本信息

    基本信息 模块主要展示了以下信息:

    • SQL ID:相同 SQL 的唯一标识。

    • SQL:具体执行的 SQL 文本。

    • TRACE ID:该执行 SQL 的全局唯一标识。

    • 请求到达时间:数据库接收到 SQL 请求的时间点

    • 计划类型:有本地、远程、分布式三种,性能依次下降。

    • 是否命中缓存:是否使用的是已经存在的执行计划(命中可避免硬解析,效率会高)。

  1. 执行详情 面板查看语句的 耗时统计

    耗时统计 模块通过条形图形象的展示了以下信息及它们之间的占比:

    • 排队时间:SQL 在等待队列中时间,如果排队时间过长,可能存在 CPU 资源争用。

    • 执行时间:SQL 的实际执行耗时(包含内部等待时间)。

    • 其它:通过数据库收到请求到执行结束消耗时间减去排队时间再减去执行时间得到,如果该值过大,需检查下网络、磁盘是否正常。

  1. 执行详情 面板查看语句的 IO 统计

    IO 统计 模块主要展示了以下信息:

    • RPC 次数:发送 RPC 的个数。OceanBase 集群作为一个分布式系统,机器间的通信是通过 RPC 完成的,如果执行计划中 rpc_count 的值过高,意味着执行的 SQL 需要频繁的进行多机通信,才能完成该 SQL 请求。需要具体分析 SQL 需要访问的数据是否分布在多台机器上,RPC 过高一般是因为远程执行或分布式执行过多,需进一步检查 SQL 执行状态。

    • 物理读次数:读取物理磁盘上数据的次数,该值不为 0,可能原因有内存不够、索引不优 和 SQL 本身获取的结果集过大等三种原因。建议查看 SQL 和索引是否存在优化空间。

    • SSSTORE 中读取的次数:SSTABLE 中读取的行数,如果该值过大,需注意该 SQL 是否获取的结果集过大或者索引是否友好。

  1. 执行详情 面板查看语句的 计划统计。

    计划统计 页签结构化的展示了语句执行后的执行计划。它同 计划详情 页面中的结构一样,详情可查看步骤 3 中 计划统计 的信息。

  2. 执行详情 面板查看语句的 大纲

    大纲 页签展示了执行计划返回的结果中 OUTLINE DATA 对应的内容。这部分内容是优化器为了完全复现某一计划而生成的一组 Hint 信息。