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

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

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.rhkb.cn/news/342486.html

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

相关文章

SOA的发展历史

1.SOA的发展历程 回顾SOA发展历程&#xff0c;我们把其大致分为了三个阶段&#xff0c;下面将分别介绍每个阶段的重要标准和规范。 1.1.萌芽阶段 这一阶段以XML技术为标志&#xff0c;时间大致从20世纪90年代末到21世纪初。XML系W3C所建&#xff0c;源自流行的标准通用标记语…

力扣 226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* invertTree(struct Tr…

【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法

文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要设计一个ECU节点的CAN网路数据发送&#xff0c;需求是在500k的通信波特率上&a…

lux和ffmpeg进行下载各大主流自媒体平台视频

1、lux下载&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取码&#xff1a;agpp 2、ffmpeg下载&#xff0c;跟lux放在同一个目录&#xff1b; 3、为lux、ffmpeg设置环境变量&#xff1b; 4、WINR&#xff0c;打开运行&#xff0…

SIMBA方法解读

目录 预处理scRNA-seqscATAC-seq 图构建&#xff08;5种场景&#xff09;scRNA-seq分析scATAC-seq分析多模态分析批次整合多模态整合 图学习SIMBA空间中查询实体识别TF-target genes 预处理 scRNA-seq 过滤掉在少于三个细胞中表达的基因。原始计数按文库大小标准化&#xff0…

了解Kubernetes-RKE2的PKI以及证书存放位置

一、什么是PKI&#xff1f; 简称&#xff1a;证书基础设施。 可以方便理解为当你的集群有Server,Client架构&#xff0c;那么为了安全加密之间的通信&#xff0c;则需要使用证书进行交互&#xff0c;那么利用PKI架构可以安全加密组件之间的通信。 二、Kubernetes的PKI架构什…

for深入学习

目录 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 例2&#xff1a; 求0-100中含数字9个个数 作业&#xff1a; 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 代码&#xff1a; #include<stdio.h> int main() {printf("整…

React-useEffect

概念理解 useEffect是一个React Hook函数&#xff0c;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAX请求&#xff0c;更改DOM等等 说明&#xff1a;上面的组件中没有发生任何的用户事件&#xff0c;组件渲染完毕之后就需要和服务器要…

【UML用户指南】-02-UML基本元素的介绍(二)

目录 1、语法和语义规则 2、UML中的公共机制 &#xff08;1&#xff09;规约 &#xff08;2&#xff09;修饰 &#xff08;3&#xff09;通用划分 &#xff08;4&#xff09;扩展机制 衍型/版型/类型&#xff08;stereotype&#xff09; 标记值 &#xff08;tagged val…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

JVM相关:Java内存区域

Java 虚拟机&#xff08;JVM)在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 Java运行时数据区域是指Java虚拟机&#xff08;JVM&#xff09;在执行Java程序时&#xff0c;为了管理内存而划分的几个不同作用域。这些区域各自承担特定的任务&#xff0c…

sc.tl.rank_genes_groups()问题

今天被问到了一个关于sc.tl.rank_genes_groups()的奇怪的问题 import scanpy as sc import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # from CellDART import da_cellfraction # from CellDART.utils import random_mix from…

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…

ROS学习记录:自定义消息类型

前言 当我们需要传输一些特殊的数据时&#xff0c;且官方的消息包无法满足需求&#xff0c;我们便可以自己定义一个消息类型。 实验步骤 一、在终端输入cd ~/catkin_ws1/src进入工作空间中src目录 二、输入catkin_create_pkg qq_msgs roscpp rospy std_msgs message_generati…

ODBC访问达梦数据库Ubuntu18.04 x86-x64(亲测有效)

ODBC访问达梦数据库Ubuntu18.04 x86-x64 第1步&#xff1a;安装unixodbc驱动,使用下面命令。第2步&#xff1a;拷贝已经安装好的达梦数据库驱动程序第3步&#xff1a;配置ODBC必要的参数文件&#xff0c;如下图第4步&#xff1a;设置环境变量第5步&#xff1a;连接测试 说明&am…

AI大模型语料库

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 语料库概述 语料库&#xff08;Corpus&#xff09;是一个存储了大量真实语言使用实例的集合&#xff0c;这些实例可以是文本、语音、视频等多种形式的语言数据。语料库通常…

使用C++实现YOLO图像分类:从环境搭建到性能评估的完整指南

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

欢乐钓鱼大师攻略:云手机高分钓鱼技巧教程!

《欢乐钓鱼大师》是一款有趣的休闲游戏&#xff0c;适合各类玩家。本指南将帮助新手快速上手&#xff0c;掌握钓鱼技巧&#xff0c;了解装备和渔场的相关知识。 一、钓鱼的技巧 1.1专属云机 钓大鱼&#xff0c;除了好的技巧&#xff0c;选择合适的设备和软件是成功攻克《欢乐…

手机站怎么推广

随着手机的普及和移动互联网的快速发展&#xff0c;越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等&#xff0c;同时也催生了越来越多的手机站的出现。但是&#xff0c;在海量的手机站中&#xff0c;要让自己的手机站脱颖而出&#xff0c;吸引更多用户访问和使用…

Coolmuster Android助手评测:简化Android到电脑的联系人传输

产品概述 Coolmuster Android助手是一款旨在简化Android设备与计算机之间数据管理和传输过程的全面工具。它以用户友好的界面和全面的功能&#xff0c;成为寻求高效数据管理解决方案的Android用户的热门选择。 主要特点和功能Coolmuster Android助手拥有一系列使其成为管理Andr…