基于Benchmark查看OceanBase执行计划

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前服务于工业互联网
擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

    • 📣 1.BenmarkSQL
      • ✨ 1.BenmarkSQL介绍
      • ✨ 1.2 下载BenmarkSQL
    • 📣 2.OceanBase4.2 集群
      • ✨ 2.1 集群状态
      • ✨ 2.2 测试用户
    • 📣 3.配置文件修改
    • 📣 4.生成数据
    • 📣 5.创建索引
    • 📣 6.TPCC测试
    • 📣 7.TOP SQL分析
      • ✨ 7.1 查询TOP
      • ✨ 7.2 执行计划分析
    • 📣 8.报错分析
    • 📣 9.总结


本文详细介绍了OceanBase 的执行计划查看方法,包括 explain 命令和查看实际执行计划。

📣 1.BenmarkSQL

✨ 1.BenmarkSQL介绍

benchmarksql是一款符合TPC-C基准压力测试工具,TPC-C是衡量在线事务处理的基准。
TPC-C模型是模拟一个商品批发公司的销售模型,这个模型涵盖了一个批发公司面向客户对一系列商品进行销售的过程,这包括管理订单,管理库存,管理账号收支等操作。这些操作涉及到仓库、商品、客户、订单等概念,围绕这些概念,构造了数据表格,以及相应的数据库操作。

✨ 1.2 下载BenmarkSQL

注意:需要java环境,不低于1.8.0
[root@centos79 ~]# yum install git
[root@centos79 ~]# git clone https://github.com/obpilot/benchmarksql-5.0.git

[root@centos79 ~]# git clone https://github.com/obpilot/benchmarksql-5.0.git
Cloning into 'benchmarksql-5.0'...
remote: Enumerating objects: 110, done.
remote: Counting objects: 100% (110/110), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 110 (delta 14), reused 105 (delta 12), pack-reused 0
Receiving objects: 100% (110/110), 5.58 MiB | 89.00 KiB/s, done.
Resolving deltas: 100% (14/14), done.

📣 2.OceanBase4.2 集群

✨ 2.1 集群状态

1.启动 OceanBase 数据库
[root@centos79 ~]# su - admin
[admin@centos79 ~]$ obd cluster start obtest
obclient -h192.168.3.20 -P2881 -uroot -p’gxmxiv4fV6uKhJfgDktn’ -Doceanbase -A

2.查看集群状态
[admin@centos79 ~]$ obd cluster display obtest
Get local repositories and plugins ok
Open ssh connection ok
Cluster status check ok
Connect to observer 192.168.3.20:2881 ok
Wait for observer init ok
+------------------------------------------------+
|                    observer                    |
+--------------+---------+------+-------+--------+
| ip           | version | port | zone  | status |
+--------------+---------+------+-------+--------+
| 192.168.3.20 | 4.2.2.0 | 2881 | zone1 | ACTIVE |
+--------------+---------+------+-------+--------+
obclient -h192.168.3.20 -P2881 -uroot -p'gxmxiv4fV6uKhJfgDktn' -Doceanbase -A

Connect to obproxy ok
+------------------------------------------------+
|                    obproxy                     |
+--------------+------+-----------------+--------+
| ip           | port | prometheus_port | status |
+--------------+------+-----------------+--------+
| 192.168.3.20 | 2883 | 2884            | active |
+--------------+------+-----------------+--------+
obclient -h192.168.3.20 -P2883 -uroot -p'gxmxiv4fV6uKhJfgDktn' -Doceanbase -A 

Trace ID: bb89c746-e33d-11ee-97f5-000c29377d62
If you want to view detailed obd logs, please run: obd display-trace bb89c746-e33d-11ee-97f5-000c29377d62

✨ 2.2 测试用户

–登陆租户
obclient -uroot@mq_t1 -h127.1 -P2883 -p123456 -A
obclient [(none)]> use oceanbase

–创建测试用户及数据库
obclient [oceanbase]> create database tpcc;
obclient [oceanbase]> create user tpcc identified by ‘123456’;
obclient [oceanbase]> grant all on . to tpcc;

–重新登陆
[admin@centos79 ~]$ obclient -utpcc@mq_t1 -h127.1 -P2883 -p123456 -A
obclient [(none)]> use tpcc

📣 3.配置文件修改

这个配置文件在/root/benchmarksql-5.0/run/目录下,编辑后的内容如下:
cat > /root/benchmarksql-5.0/run/props.ob <<“EOF”
db=oracle
driver=com.alipay.oceanbase.obproxy.mysql.jdbc.Driver
conn=jdbc:oceanbase://192.168.3.20:2883/tpcc?useUnicode=true&characterEncoding=utf-8
user=tpcc@mq_t1#obcluster
password=123456
warehouses=2
loadWorkers=1
terminals=10
runTxnsPerTerminal=0
runMins=1
limitTxnsPerMin=0
terminalWarehouseFixed=true
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1
EOF

📣 4.生成数据

1.修改字段类型
sql文件在benchmarksql-5.0-master/run/sql.oceanbase中,
看了一些建表语句,使用了varchar2类型,ob为mysql模式,需要修改:

[root@centos79 ~]# find / -name sql.oceanbase
/root/benchmarksql-5.0/run/sql.oceanbase

[root@centos79 ~]# cd /root/benchmarksql-5.0/run/sql.oceanbase
[root@centos79 sql.oceanbase]# ll
-rwxr-xr-x. 1 root root 190 Mar 16 19:17 indexCreates.sql
-rwxr-xr-x. 1 root root 3719 Mar 16 19:17 tableCreates3.sql
-rwxr-xr-x. 1 root root 3593 Mar 16 19:17 tableCreates.sql
[root@centos79 sql.oceanbase]# cp tableCreates.sql tableCreates_bak.sql
[root@centos79 sql.oceanbase]# sed -i ‘s/varchar2/varchar/g’ tableCreates_bak.sql

2.运行创建表语句
[root@centos79 ~]# cd /root/benchmarksql-5.0/run
[root@centos79 run]# ./runSQL.sh props.ob sql.oceanbase/tableCreates_bak.sql

这里出了点小问题,这个脚本报找不到funcs.sh文件,应该是环境变量的问题,不过通过更改脚本中funcs.sh路径为绝对路径也可以解决这个问题:

编辑一下runSQL.sh文件,更改内容如下:

#!/usr/bin/env bash
 
# ----
# Check command line usage
# ----
if [ $# -ne 2 ] ; then
    echo "usage: $(basename $0) PROPS_FILE SQL_FILE" >&2
    exit 2
fi
 
# ----
# Load common functions
# ----
source /root/benchmarksql-5.0/run/funcs.sh $1

SHARDING = 'NONE';

在这里插入图片描述

–加载数据
[root@centos79 run]# ./runLoader.sh props.ob
装载前防止有大事物,需要调整事务超时参数:
obclient [oceanbase]> show variables like ‘%timeout%’;
±--------------------±-----------------+
| Variable_name | Value |
±--------------------±-----------------+
| connect_timeout | 10 |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| ob_pl_block_timeout | 3216672000000000 |
| ob_query_timeout | 10000000 |
| ob_trx_idle_timeout | 86400000000 |
| ob_trx_lock_timeout | -1 |
| ob_trx_timeout | 86400000000 |
| wait_timeout | 28800 |
±--------------------±-----------------+

obclient [oceanbase]> set global ob_trx_timeout=864000000000;
obclient [oceanbase]> set global ob_query_timeout=864000000000;
说明:
1.运行脚本,装载数据,输出显示装载成功
2.运行脚本报错,记得删除中文描述即可

[root@centos79 run]# ./runLoader.sh props.ob

在这里插入图片描述

📣 5.创建索引

[root@centos79 run]# ./runSQL.sh props.ob sql.oceanbase/indexCreates.sql
# ------------------------------------------------------------
# Loading SQL file sql.oceanbase/indexCreates.sql
# ------------------------------------------------------------
create index bmsql_customer_idx1
on  bmsql_customer (c_w_id, c_d_id, c_last, c_first) local;
create  index bmsql_oorder_idx1
on  bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id) local;

📣 6.TPCC测试

[root@centos79 run]# ./runBenchmark.sh props.ob

在这里插入图片描述

📣 7.TOP SQL分析

✨ 7.1 查询TOP

obclient [tpcc]> show variables like ‘%enable_sql_audit%’;
±--------------------±------+
| Variable_name | Value |
±--------------------±------+
| ob_enable_sql_audit | ON |
±--------------------±------+

SELECT sql_id, count(*),round(avg(elapsed_time)) avg_elapsed_time,
round(avg(execute_time)) avg_exec_time,
s.svr_ip,
s.svr_port,
s.tenant_id,
s.plan_id
FROM oceanbase.GV$OB_SQL_AUDIT s
WHERE 1=1
and user_name=‘tpcc’
and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 200 MINUTE) )
GROUP BY sql_id
order by avg_elapsed_time desc limit 10;

在这里插入图片描述

✨ 7.2 执行计划分析

select distinct query_sql from oceanbase.GV$OB_SQL_AUDIT where sql_id='7229213613983BC5FDA15AD11EC70D01';
  +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| query_sql                                                                                                                                                                                                                                |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04,s_dist_05, s_dist_06, s_dist_07, s_dist_08,s_dist_09, s_dist_10   FROM bmsql_stock     WHERE s_w_id = 1 AND s_i_id = 97744     FOR UPDATE |
| SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04,s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10    FROM bmsql_stock     WHERE s_w_id = 2 AND s_i_id = 10652     FOR UPDATE |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.068 sec)

实际执行计划


SELECT SVR_IP, plan_depth, plan_line_id,operator,name,rows,cost,property from GV$OB_PLAN_CACHE_PLAN_EXPLAIN
where tenant_id=1002 AND SVR_IP = '192.168.3.20' 
AND svr_port=2882 AND plan_id=681\G;

     *************************** 1. row ***************************
                ip: 127.0.0.1
        plan_depth: 0
      plan_line_id: 0
          operator: PHY_TABLE_SCAN
              name: bmsql_stock
              rows: 9
              cost: 248249
          property: table_rows:86530, physical_range_rows:200159, logical_range_rows:86530, index_back_rows:0, output_rows:8, est_method:local_storage, avaiable_index_name[bmsql_stock], estimation info[table_id:1100611139453798, (table_type:1, version:0-1-1, logical_rc:0, physical_rc:0), (table_type:7, version:1-1643245354224215-1643245354224215, logical_rc:0, physical_rc:96654), (table_type:0, version:1643245354224215-1643245354224215-9223372036854775807, logical_rc:86530, physical_rc:103505)]
      1 row in set (0.013 sec)
      
      ERROR: No query specified  

解释执行计划


  *************************** 1. row ***************************
      Query Plan: ============================================
      |ID|OPERATOR  |NAME       |EST. ROWS|COST  |
      --------------------------------------------
      |0 |TABLE SCAN|bmsql_stock|9        |248250|
      ============================================
 
      Outputs & filters:
      -------------------------------------
        0 - output([bmsql_stock.s_quantity], [bmsql_stock.s_data], [bmsql_stock.s_dist_01], [bmsql_stock.s_dist_02], [bmsql_stock.s_dist_03], [bmsql_stock.s_dist_04], [bmsql_stock.s_dist_05], [bmsql_stock.s_dist_06], [bmsql_stock.s_dist_07], [bmsql_stock.s_dist_08], [bmsql_stock.s_dist_09], [bmsql_stock.s_dist_10]), filter([bmsql_stock.s_w_id = 2], [bmsql_stock.s_i_id = 10652]),
            access([bmsql_stock.s_w_id], [bmsql_stock.s_i_id], [bmsql_stock.s_quantity], [bmsql_stock.s_data], [bmsql_stock.s_dist_01], [bmsql_stock.s_dist_02], [bmsql_stock.s_dist_03], [bmsql_stock.s_dist_04], [bmsql_stock.s_dist_05], [bmsql_stock.s_dist_06], [bmsql_stock.s_dist_07], [bmsql_stock.s_dist_08], [bmsql_stock.s_dist_09], [bmsql_stock.s_dist_10]), partitions(p0)
 
      1 row in set (0.016 sec)
 
      ERROR: No query specified![      ](/Users/mac/Library/Application Support/typora-user-images/image-20240316002639580.png)

📣 8.报错分析

1.TPCC测试以下报错处理
20:17:55,307 [main] ERROR jTPCC : Term-00, Invalid number of terminals! Usage: 15MB / 178MB
props.ob文件里设置的需要满足:
1.文件的所有注释和多余空格删除,否则可能报错
2.0<Terminals num<=10* Warehouses num

生成数据拨错处理
./runSQL.sh props.ob sql.oceanbase/tableCreates_bak.sql
You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘“tpcc_group”’ at line 1
原因为OB4.2版本影响导致语法的错误
create tablegroup “tpcc_group” 变更为:
create tablegroup tpcc_group";

📣 9.总结

通过本文的学习,可以帮助大家掌握 OceanBase 的执行计划查看方法,包括 explain 命令和查看实际执行计划。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32-定时器输入捕获

目录 一、输入捕获简介 二、输入捕获框图 1.定时器总框图 2.输入捕获框图 3.主从触发模式 三、固件库实现 1.定时器测量PWM频率 2.PWMI模式 一、输入捕获简介 二、输入捕获框图 1.定时器总框图 上图可知&#xff0c;四个输入捕获和输出比较共用4个CCR寄存器&#x…

perl 用 XML::LibXML DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 在云计算中&#xff0c;解析XML元素和属性是一种常见的操作…

数据库 | MYSQL这个复杂系统如何上手?

当你不知道从何入手研究或解决一个复杂系统的问题时&#xff0c;通常意味着你没有找到合适的切入点或者缺乏对系统整体和细节之间联系的理解。在这种情况下&#xff0c;一个有用的策略是寻找系统的基本原理或构成要素。 小时候&#xff0c;你可能也玩过玩具四驱车。有的四驱车…

如何搭建“Docker Registry私有仓库,在CentOS7”?

1、下载镜像Docker Registry docker pull registry:2.7.1 2、运行私有库Registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restartalways --name registry registry:2.7.1 3、拉取镜像 docker pull busybox 4、打标签&#xff0c;修改IP&#x…

气液分离器的选型介绍

气液分离器在热泵或制冷系统中的基本作用是分离出并保存回气管里的液体以防止压缩机液击。因此,它可以暂时储存多余的制冷剂液体,并且也防止了多余制冷剂流到压缩机曲轴箱造成油的稀释。因为在分离过程中,冷冻油也会被分离出来并积存在底部,所以在气液分离器出口管和底部会…

Github 2024-03-16 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目2Go项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Gene…

绝地求生:PUBG 2024年 更新重点偏向于武器平衡、游戏互动及联名道具

一、游戏体验 1. 增加可破坏的环境 1.1 增加更多互动功能 通过可破坏环境将游戏方式变得千变万化。待功能上线&#xff0c;在后续游戏中玩家可以对建筑物进行部分破坏来开辟新的进攻、撤退路线&#xff0c;或搭建掩体进行战略性攻击。 环境破坏部分功能&#xff0c;将会在4…

“风口”上的量化大厂“绣球”抛向中低频人才

量化人才这几年是人才舞台上的“香饽饽”。 遵循着低频不如高频、小厂不如大厂的薪资逻辑&#xff0c;各路人才被各路机构“哄抢”&#xff0c;薪资一路走高。 但2024年的“信号”再强烈不过——量化大厂们到了改变的时候了。 而量化大厂们显然对此已“心知肚明”....... “…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…

深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

oracle基础-子查询 备份

一、什么是子查询 子查询是在SQL语句内的另外一条select语句&#xff0c;也被称为内查询活着内select语句。在select、insert、update、delete命令中允许是一个表达式的地方都可以包含子查询&#xff0c;子查询也可以包含在另一个子查询中。 【例1.1】在Scott模式下&#xff0…

CSS扩展选择器

文章目录 1. 并集选择器2. 交集选择器3. 后代选择器4. 子代选择器5. 兄弟选择器5.1. 相邻兄弟选择器5.2. 通用兄弟选择器 6. 属性选择器7. 伪类选择器7.1. 动态伪类7.2. 结构伪类7.3. 否定伪类 8. 伪元素选择器9. Google 改进案例 1. 并集选择器 选中多个选择器对应的元素。一…

如何在Linux上使用git远程上传至gitee托管(add-commit-push指令详解)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Xpay源支付2.8.8免授权聚合免签系统

产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的ThinkPHP 6.1.2 Layui 2.8.10 PearAdmin架构&#xff0c…

面向对象(下)

目录 01、static1.1、static的使用1.2、static应用举例1.3、单例(Singleton)设计模式 02、main方法的语法03、类的成员之四&#xff1a;代码块04、关键字&#xff1a;final05、抽象类与抽象方法5.1、多态的应用&#xff1a;模板方法设计模式(TemplateMethod) 06、接口(interfac…

使用reprepro+nginx搭建apt服务器

目录 项目背景 项目要求 项目开发过程 1、apt服务器的搭建 2、实现自定义指定源文件列表来实现apt update更新 3、实现软件启动时自动更新 4. source.list中镜像源地址的格式 项目开发的难点/坑点 总结 项目背景 前面写过一篇“利用Nginx搭建一个apt服务器”&#xff…

异次元发卡源码系统/荔枝发卡V3.0二次元风格发卡网全开源源码

– 支付系统&#xff0c;已经接入易支付及Z支付免签接口。 – 云更新&#xff0c;如果系统升级新版本&#xff0c;你无需进行繁琐操作&#xff0c;只需要在你的店铺后台就可以无缝完成升级。 – 商品销售&#xff0c;支持商品配图、会员价、游客价、邮件通知、卡密预选&#…

双线性插值缩放算法原理以及matlab与verilog的实现(二)

系列文章目录 双线性插值缩放算法原理以及matlab与verilog的实现&#xff08;一&#xff09; 文章目录 系列文章目录前言一、前提回顾二、FPGA实现步骤2.1 找到源图像四个像素点求目标像素点2.2 FPGA实现步骤2.3 总体框架2.4 ROM缓存模块2.5 VGA模块2.6 双线性算法模块 三、下…

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站&#xff0c; 你可能顺利地使用chatGPT、Gemini&#xff0c; 用得很happy。 突然有一天&#xff0c;你发现一些网站&#xff0c;除了chatGPT、Gemini &#xff0c;还可以切换使用国内外其他的大模型…

【原创】一文读懂RAG的来源、发展和前沿

检索增强生成(Retrieval Augmented Generation&#xff0c;RAG)结合了检索 (Retrieval) 和生成 (Generation) 两个过程&#xff0c;旨在提高机器生成文本的相关性、准确性和多样性。RAG通过在生成文本输出之前先检索大量相关信息&#xff0c;然后将这些检索到的信息作为上下文输…