SQL性能优化 ——OceanBase SQL 性能调优实践分享(3)

news2024/12/28 22:18:00

相比较之前的两篇《连接调优》和《索引调优》,本篇文章主要是对先前两篇内容的整理与应用,这里不仅归纳了性能优化的策略,也通过具体的案例,详细展示了如何分析并定位性能瓶颈的步骤。

SQL 调优

先给出性能优化方法和分析性能瓶颈步骤的文字描述:

性能优化的方法

  1. 开启并行执行等机制(简单),可以参考:《OceanBase 并行执行技术》。这篇博客内容过多(实际应该像性能调优系列拆成多篇发的),从 4.2 版本开始,OB 已经支持了 auto dop,如果用户不熟悉并行度的设置规则,可以设置 parallel_degree_policy 为 AUTO,让优化器帮忙自动选择合适的并行度,推荐使用。auto dop 的相关内容可以直接在上面这篇博客中搜索 parallel_degree_policy 关键字,或者参考官网文档。
  2. 创建合适的索引(简单),可以参考:《索引调优 —— OceanBase SQL 性能调优系列 1》。
  3. 调整连接方式(比较简单),可以参考:《连接调优 —— OceanBase SQL 性能调优系列 2》
  4. 调整连接顺序(难度较大),这里指的是:例如有 t1,t2,t3 三个表做连接, 假设 OB 的优化器认为 t1,t2 两个表先做连接,再与 t3 做连接,是一个比较好的计划。但是实际可能是 t1 和 t3 先做连接,再和 t2 做连接是更优的计划。此时可以通过 hint 告诉优化器正确的连接顺序来优化 SQL 的性能(参考官网文档),在一些复杂场景下,需要丰富的经验支持才能通过调整连接顺序来优化 SQL 执行效率,有兴趣的同学可以自行研究和尝试。
  5. 检查 OB 是否做了错误的查询改写 / 缺少合适的查询改写机制(难度较大)。

分析性能瓶颈的步骤

  1. 利用 SQL 执行计划去分析具体哪些步骤(哪几个算子)的执行时间慢。个人经验是可以通过把大 SQL 拆分成小 SQL 去分析这一步。
  2. 充分利用已有的脚本和工具来简化分析过程。这里我理解主要是通过一些字典视图,例如 oceanbase.GV$SQL_PLAN_MONITOR。

分析 SQL 性能瓶颈的例子

举一个真实的 SQL 性能分析和优化的例子:下面这条 SQL 执行了 2.43 秒,接下来开始分析性能瓶颈并进行优化。

1705634431

看到优化器生成计划是让 bbtr 表先与 cte 表做 merge join,再与 btr 表做 nest loop join。

1705634441

在上面的计划中,从 4 号算子到 8 号算子是三张表的 join 是这个计划最核心的部分,大概率也是性能的瓶颈点,我们先从这里开始分析。

=============================
|ID|OPERATOR           |NAME|
-----------------------------
|4 |NESTED-LOOP JOIN   |    |
|5 |├─MERGE JOIN       |    |
|6 |│  └─TABLE SCAN    |BBTR|
|7 |│  └─TABLE SCAN    |CTE |
|8 |└─TABLE GET        |BTR |
=============================

要分析出计划里哪里是瓶颈,首先得查一下每个表的数据量,先看最内层进行 merge join 的两张表 cte 和 bbtr,merge join 的代价是扫描出 cte 数据的代价 + 扫描出 bbtr 的代价 + 归并的代价:

cte 表在 7 号算子中的过滤条件是 cte.bpo_send_flag = '0',过滤之后返回数据量是 1638 行,扫描耗时 2.13 秒(这个时间明显不太对)。

1705634448

类似地,bbtr 表的数据在 6 号算子返回的数据量是 40 多万行,没有过滤条件,扫描耗费 0.19 秒。

1705634462

然后上层的 NLJ 要拿 merge join 的结果当做驱动表(左表),对右表 btr 进行 table get。

这条 SQL 一共执行了 2.43 秒,但仅仅是 merge join 中 cte 表的扫描代价就已经高达 2.13 秒了,所以这条 SQL 的瓶颈点就是 cte 表的扫描。

可以看到 cte 表上有一个过滤条件 bpo_send_flag = '0',所以我们可以通过在 cte 表的列 bpo_send_flag 上建一个索引来优化它的查询性能。如果考虑到计划中的 7 号算子还需要拿 cte 表中的 bpo_send_time 列和 claim_tpa_id 列的数据向上吐行,还可以考虑在(bpo_send_flag, bpo_send_time, claim_tpa_id)上创建联合索引来消除索引回表的性能消耗。

创建索引之后的计划预期大概会长这样:

=================================
|ID|OPERATOR           |NAME    |
---------------------------------
|4 |NESTED-LOOP JOIN   |        |
|5 |├─MERGE JOIN       |        |
|6 |│  └─TABLE SCAN    |BBTR    |
|7 |│  └─TABLE SCAN    |CTE(idx)|
|8 |└─TABLE GET        |BTR     |
=================================

假如上面排查下来发现 cte 表的扫描并不是瓶颈,那么应该做进一步的分析。例如尝试去单独去执行 bbtr 和 cte 两个表的连接,查看它的执行结果的行数和 btr 表的行数关系。4 号 NLJ 算子的左支返回的行数(merge join 结果的行)和右支返回的行数(btr 通过 8 号算子中 filter 过滤之后的行)如果没有明显的大小表关系(左支行数 / 右支行数 < 20),则意味着 4 号算子选择 Hash Join 的方式会比选择 NLJ 的方式更优。那么就可以通过使用 hint /*+ leading(bbtr cte btr) use_hash(btr) */ 来修改 4 号算子的连接方式,将 Nested_Loop Join 改成 Hash Join。

hint 和 outline

使用 hint 生成指定计划

官网上写的很详细,这里不再赘述,详见 OB 官网中的 hint 部分:

1705634481

使用 outline 进行计划绑定

官网上写的很详细,这里不再赘述,详见 OB 官网中的计划绑定部分:

1705634491

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

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

相关文章

二叉树创建和遍历

个人主页 &#xff1a;敲上瘾-CSDN博客二叉树介绍&#xff1a;二叉树(详解)-CSDN博客 目录 一、二叉树的创建 二、二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历 三、相关计算 1.总节点个数计算 2.叶子节点个数计算 3.深度计算 一、二叉树的创建 关于…

Lodop 实现局域网打印

文章目录 前言一、Lodop支持打印的方式lodop 打印方式一般有3种&#xff1a;本地打印局域网集中打印广域网AO打印 二、集成步骤查看lodop 插件的服务端口&#xff1a;查看ip后端提供接口返回ip&#xff0c;前端动态获取最后步骤 前言 有时候会根据不同的ip来获取资源文件&…

天锐绿盾 | 源代码防泄密软件

#源代码防泄密# 天锐绿盾是一款专为企业设计的&#xff0c;旨在保护企业核心数据安全与防止代码泄露的软件。它通过一系列技术手段实现对信息的加密、访问控制、行为审计、外发控制等&#xff0c;以确保企业内部的代码和敏感信息不会未经授权就被泄露出去。 PC地址&#xff1a…

音视频开发19 FFmpeg 视频解码- 将 h264 转化成 yuv

视频解码过程 视频解码过程如下图所示&#xff1a; ⼀般解出来的是420p FFmpeg流程 这里的流程是和音频的解码过程一样的&#xff0c;不同的只有在存储YUV数据的时候的形式 存储YUV 数据 如果知道YUV 数据的格式 前提&#xff1a;这里我们打开的h264文件&#xff0c;默认是YU…

电子元器件采购商城的售后服务保障

电子元器件采购商城的售后服务保障是用户在采购电子元器件时的重要考量因素之一。以下是常见的售后服务保障内容&#xff1a; 退换货政策&#xff1a; 质量问题退换货&#xff1a;如果用户收到的元器件存在质量问题&#xff0c;通常可以在一定时间内申请退换货。无理由退换货&a…

Linux--Socket编程基础

一、Socket简介 套接字&#xff08; socket &#xff09;是 Linux 下的一种进程间通信机制&#xff08; socket IPC &#xff09;&#xff0c; 使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信&#xff08;网络通信&#xff09;&#xff0c;当然也可以是同一台…

【C++课程学习】:C++入门(输入输出,缺省参数)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.关于C输入输出&#xff1a; &#x1f369;2.缺省参数函数&#xff1a; 缺省参数的概…

手上3个offer怎么选,深信服的技服、奇安信的安全服务、绿盟的渗透工程师

我是一个应届生&#xff0c;目前手上收到了3个offer比较纠结选哪个&#xff1f; 1、深信服技术服务工程师&#xff0c;base 西安&#xff0c;月薪 14k 据说还有些异地补助 2、奇安信安全服务工程师&#xff0c;base 重庆&#xff0c;月薪 12k 3、绿盟科技的渗透工程师&#…

轻松掌握PDF文本内容修改技巧,让文档编辑更高效便捷,职场工作从此得心应手!

在快节奏的职场生活中&#xff0c;PDF文档已经成为我们工作中不可或缺的一部分。然而&#xff0c;如何高效、便捷地修改PDF文本内容&#xff0c;一直是许多职场人士头疼的问题。今天&#xff0c;就让我来为你介绍一款神奇的编辑工具——首助编辑高手&#xff0c;它将帮助你轻松…

http://app.hrss.xm.gov.cn/xmggfw/index

厦门市人力资源和社会保障局 厦门市国际职业资格比照认定职称审批表

【Cesium4UE】使用问题及解法统计

本期作者&#xff1a;尼克 易知微3D引擎技术负责人 1.加载3dtiles模型很慢 1.3dtiles是否做了重建顶层处理。如果3dtiles的tiles块太多使用CesiumLab重建顶层。 2.将3dtiles模型放置到固态硬盘中 3.如果有多块3dtiles&#xff0c;考虑使用CesiumLab合并3dtiles处理 4.如果不需…

14本剔除!Scopus目录第四次更新,Hindawi期刊再次上榜

【SciencePub学术】近期&#xff0c;Scopus数据库迎来本年度第四次更新&#xff01;此次更新后&#xff0c;有89本期刊发生变动&#xff1a; 变动详情 •【新增】75本新增期刊进入Scopus数据库 •【剔除】14本期刊被Scopus数据库剔除 目前Scopus 来源出版物列表&#xff08;…

Apple - Image I/O Programming Guide

翻译自&#xff1a;Image I/O Programming Guide&#xff08;更新时间&#xff1a;2016-09-13 https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/ImageIOGuide/imageio_intro/ikpg_intro.html#//apple_ref/doc/uid/TP40005462 文章目录 …

关于教务排课的那些事

在办学过程中&#xff0c;你是否被如下问题困扰&#xff1f; 1、排课功率低&#xff1a; 为了确保师资资源得到充分利用&#xff0c;教务教师排课要求了解每一个全职和兼职教师&#xff0c;了解每一个人的时刻组织和带班状况&#xff0c;因而在排课的时分需求处理很多的信息&a…

InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)

Mysql是如何实现隔离性的&#xff1f;&#xff08;锁MVCC&#xff09; 隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的&#xff0c;并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时&#xff0c;可能存在交叉执行导致数据的不…

Sketch语言设置指南:将英文版改成中文版的教程

Sketch版本的转换一直是困扰大家的关键问题。如今UI设计领域的UI设计软件很多&#xff0c;但大部分都是英文版。对于国内英语基础差的设计师来说&#xff0c;使用这样的软件无形中增加了工作量&#xff0c;往往需要在设计编辑的同时查阅翻译。即时设计详细介绍了Sketch英文版如…

夏季高温来袭|危化品如何安全储存?

《危险化学品安全管理条例》第三条 本条例所称危险化学品&#xff0c;是指具有毒害、腐蚀、爆炸、燃烧、助燃等性质&#xff0c;对人体、设施、环境具有危害的剧毒化学品和其他化学品。 随着夏天高温的来袭&#xff0c;炎热的天气对危化品储存威胁巨大&#xff0c;危化品事故也…

3. QGis二次开发项目实践一之解决“无法定位程序输入点“

前言 本章讲述实现本项目实现过程中遇到的QGis二次开发库版本和Qt以及其他动态库的版本匹配问题问题复现 本项目是要作为一个子模块集成到用户的项目中本项目最初的开发环境为QGis3.28+Qt5.15.2,而当时并未问清楚用户开发环境所以交付给用户之后,出现了类似下图的问题 出现该…

m1系列芯片aarch64架构使用docker-compose安装seata

之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 seata 镜像, 所以就尝试的安装了下, 亲测可用: 使用该命令查看正在运行的 seata 容器 docker ps | grep seata 一. docker-compose.yml 命令编写 volumes 命令所指定的宿主机映射地址, 需要根据自己的电脑环境更换 环…

windows设置网络共享目录

在一个局域网内的计算机&#xff0c;我们想要共享一些资料&#xff0c;如何操作呢&#xff1f;下面我将用windows系统中的网络共享功能实现。 设置共享目录 首先在一台服务器或者计算机上新建一个文件夹&#xff08;或者直接找一个空的分区&#xff09;作为共享的目录&#x…