实践练习六(必选):查看 OceanBase 执行计划

一、系统环境

系统配置:4C16G500G

操作系统:centOS 7.9.2009

 

二、系统设置

1、Jdk

Java -version

 

 

2、sys租户参数

alter system set enable_auto_leader_switch=false;

alter system set enable_one_phase_commit=false;

alter system set enable_monotonic_weak_read = true;

alter system set weak_read_version_refresh_interval='5s';

alter system _ob_minor_merge_schedule_interval='5s';

alter system set memory_limit_percentage = 90;   

alter system set memstore_limit_percentage = 55; 

alter system set freeze_trigger_percentage = 70;

alter system set minor_freeze_times = 50;       

alter system set minor_warm_up_duration_time = 0; 

alter system set merge_thread_count = 32; 

alter system set minor_merge_concurrency = 8; 

alter system set _mini_merge_concurrency = 4; 

 

 

3、PROXY 参数

alter proxyconfig set proxy_mem_limited='4G';

alter proxyconfig set enable_compression_protocol=false;

alter proxyconfig set work_thread_num=32;

alter proxyconfig set enable_compression_protocol=false;

alter proxyconfig set enable_metadb_used=false;

alter proxyconfig set enable_standby=false;

alter proxyconfig set enable_strict_stat_time=false;

alter proxyconfig set use_local_dbconfig=true;

 

4、设置租户,防止事务超时

set global ob_timestamp_service='GTS' ;

set global autocommit=ON;

set global ob_query_timeout=36000000000;

set global ob_trx_timeout=36000000000;

set global max_allowed_packet=67108864;

set global ob_sql_work_area_percentage=100;

set global parallel_max_servers=800;

set global parallel_servers_target=800;

 

三、BenchmarkSQL安装配置

1、下载BenchmarkSQL

https://github.com/obpilot/benchmarksql-5.0

2、解压BenchmarkSQL

unzip benchmarksql-5.0-master.zip

复制到root目录下

cp -r benchmarksql-5.0-master /root/benchmarksql/

 

3、修改配置文件

vim /home/benchmarksql-5.0-master/run/props.ob

 

db=oracle

driver=com.alipay.oceanbase.obproxy.mysql.jdbc.Driver

conn=jdbc:oceanbase://127.1:2883/tpcc?useUnicode=true&characterEncoding=utf-8

user=tpcc@obmysql#obdemo

password=tpcc123

 

warehouses=2

loadWorkers=10

 

terminals=10

//To run specified transactions per terminal- runMins must equal zero

runTxnsPerTerminal=0

//To run for specified minutes- runTxnsPerTerminal must equal zero

runMins=1

//Number of total transactions per minute

limitTxnsPerMin=0

 

//Set to true to run in 4.x compatible mode. Set to false to use the

//entire configured database evenly.

terminalWarehouseFixed=true

 

//The following five values must add up to 100

newOrderWeight=45

paymentWeight=43

orderStatusWeight=4

deliveryWeight=4

stockLevelWeight=4

 

// Directory name to create for collecting detailed result data.

// Comment this out to suppress.

resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS

osCollectorScript=./misc/os_collector_linux.py

osCollectorInterval=1

 

4、登陆数据库

 obclient -h 192.168.3.232 -P 2883 -uroot@obmysql#obdemo -p -c -A oceanbase

 

5、创建测试库

 

6、创建用户

create user tpcc identified by 'tpcc123';

 

7、授权

grant all privileges on tpcc.* to tpcc ;

 

 

8、修改脚本

runSQL.sh

runLoader.sh

runBenchmark.sh

这三个文件中的这一行,加载绝对路径。

source funcs.sh $1                    ###############原文件

source /root/benchmarksql/run/funcs.sh $1 ##############修改后

 

 

9、创建表

sh runSQL.sh props.ob sql.common/tableCreates.sql

 

10、加载数据

sh runLoader.sh props.ob

 

11、创建索引

obclient -h 192.168.3.232 -P 2883 -utpcc@obmysql#obdemo -p -c -A tpcc

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;

 

12、运行测试

sh runBenchmark.sh props.ob

 

13、TPC-C TOP SQL分析

13.1查询TOP10 sql

SELECT sql_id, count(*), round(avg(elapsed_time)) avg_elapsed_time, round(avg(execute_time)) avg_exec_time FROM gv$sql_audit s WHERE 1=1 and user_name='tpcc' and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) ) GROUP BY sql_id order by avg_elapsed_time desc limit 10;

 

 

13.2对 elapsed 时间最长的前三条 sql 进行分析

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 gv$sql_audit s WHERE 1=1 and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) ) GROUP BY sql_id order by avg_elapsed_time desc limit 3;

 

select distinct query_sql from gv$sql_audit where sql_id='B1F3DF2C7803B02C326BAB74BB140979';

select distinct query_sql from gv$sql_audit where sql_id='F59A700FA168324279B0DBC25E19760F';

select distinct query_sql from gv$sql_audit where sql_id='958908427DC1272ECC2E393F2776589F'\G;

 

 

14、分析执行计划

explain SELECT count(*) AS low_stock FROM (   SELECT s_w_id, s_i_id, s_quantity FROM bmsql_stock WHERE s_w_id = 1 AND s_quantity < 14 AND s_i_id IN (SELECT ol_i_id FROM bmsql_district JOIN bmsql_order_line ON ol_w_id = d_w_id AND ol_d_id = d_id AND ol_o_id >= d_next_o_id - 20                 AND ol_o_id < d_next_o_id WHERE d_w_id = 1 AND d_id = 3))

 

查询plan_id

SELECT * FROM v$plan_cache_plan_stat WHERE tenant_id= 1001 AND STATEMENT LIKE 'SELECT count(*) AS low_stock FROM%'\G

 

实际执行计划

SELECT * FROM v$plan_cache_plan_explain WHERE tenant_id = 1001 AND plan_id = 180;