oceanbase 性能监控04-性能分析sql

1 . 查询是否存在sql 等待

select sql_id, elapsed_time, queue_time, get_plan_time, execute_time, application_wait_time, concurrency_wait_time, user_io_wait_time, schedule_time, event, wait_class, wait_time_micro, total_wait_time_micro 
from v$sql_audit 
 where trace_id = 'YB420B84FE35-0005648A67211DC9'\G


 
2.找到所有SQL中平均执行时间排在TOP N的SQL

select/*+ parallel(15)*/ avg_exe_usec, svr_ip, svr_port, sql_id, plan_id 
 from oceanbase.gv$plan_cache_plan_stat 
 where tenant_id = 1001 
 order by avg_exe_usec desc
 limit 3\G;


 
3.如何查看集群SQL请求流量是否均衡?

select/*+ parallel(15)*/t2.zone, t1.svr_ip,  count(*) as QPS, avg(t1.elapsed_time), avg(t1.queue_time)  
 from oceanbase.gv$sql_audit t1, __all_server t2  
 where t1.svr_ip = t2.svr_ip and IS_EXECUTOR_RPC = 0    
       and request_time > (time_to_usec(now()) - 1000000)    
       and request_time < time_to_usec(now())
 group by t1.svr_ip  
 order by t2.zone;
 


4. 如何查看分布式计划rpc执行数是否均衡?

select/*+ parallel(15)*/t2.zone, t1.svr_ip,  count(*) as RPC_COUNT, avg(t1.elapsed_time), avg(t1.queue_time)  
 from oceanbase.gv$sql_audit t1, __all_server t2  
 where t1.svr_ip = t2.svr_ip and IS_EXECUTOR_RPC = 1    
       and tenant_id = 1001
       and request_time > (time_to_usec(now()) - 1000000)    
      and request_time < time_to_usec(now()) 
 group by t1.svr_ip  
 order by t2.zone;


 
 5.查询SQL流量分布情况及QPS

 select/*+ parallel(15)*/t2.zone, t1.svr_ip,  count(*) as RPC_COUNT, avg(t1.elapsed_time), avg(t1.queue_time)  
from oceanbase.gv$sql_audit t1, __all_server t2  
where t1.svr_ip = t2.svr_ip 
      and tenant_id = 1001
      and SQL_ID = 'BF7AA13A28DF50BA5C33FF19F1DBD8A9'
      and IS_EXECUTOR_RPC = 0    
      and request_time > (time_to_usec(now()) - 1000000)    
     and request_time < time_to_usec(now())
group by t1.svr_ip


6. 查询某段时间内请求次数排在TOP N的SQL

select/*+ parallel(15)*/ SQL_ID,   count(*) as QPS, avg(t1.elapsed_time) RT   from oceanbase.gv$sql_audit t1   where   tenant_id = 1001       and IS_EXECUTOR_RPC = 0           and request_time > (time_to_usec(now()) - 10000000)           and request_time < time_to_usec(now()) group by t1.sql_id order by QPS desc limit 10;

7. 查询某段时间内平均RT排在TOP N的SQL

select/*+ parallel(15)*/ SQL_ID,   count(*) as QPS, avg(t1.elapsed_time) RT   
 from oceanbase.gv$sql_audit t1   
 where   tenant_id = 1001       and IS_EXECUTOR_RPC = 0    
        and request_time > (time_to_usec(now()) - 10000000)       
         and request_time < time_to_usec(now())
 group by t1.sql_id 
 order by RT desc 
 limit 10;
 


8.查询某段时间内执行时间排TOP N的请求

select/*+ parallel(15)*/ sql_id, elapsed_time , trace_id    
 from oceanbase.gv$sql_audit     
 where   tenant_id = 1001 
         and IS_EXECUTOR_RPC = 0 
        and request_time > (time_to_usec(now()) - 10000000) 
        and request_time < time_to_usec(now()) 
 order by elapsed_time desc  
 limit 10;


 
9.判断系统或某个SQL的执行是否出现大量请求不合理的使用了远程执行

select count(*), plan_type    
from oceanbase.gv$sql_audit     
where tenant_id = 1001          
      and IS_EXECUTOR_RPC = 0          
      and request_time > (time_to_usec(now()) - 10000000)         
      and request_time < time_to_usec(now()) 
group by plan_type ;

10.找出某个租户中全表扫描的SQL

select query_sql 
from oceanbase.gv$sql_audit 
where table_scan = 1 and tenant_id = 1001 
group by sql_id;

11.
分布式计划如何分析查询问题
1)先确定是否为分布式计划, (g)v$plan_cache_plan_stat, (g)v$sql_audit中均对执行计划类型有记录;
2)分析该执行计划是否正确;
3)通过trace_id关联查询gv$sql_audit, 查看所有执行的子计划耗时情况,每个子计划的RPC执行均对应一条sql_audit记录,分析该sql_audit记录来定位问题, 如下举例:is_executor_rpc = 1表示子计划执行在sql_audit中记录,主要记录执行相关信息。is_executor_rpc = 0表示接受sql请求的线程在sql_audit中的记录, 该记录含有SQL执行过程的信息,包括SQL信息,获取执行计划信息等。

select/*+ parallel(15)*/ sql_id, is_executor_rpc, elapsed_time 
 2from oceanbase.gv$sql_audit
 3where trace_id = 'YB420AB74FC6-00056349D323483A';

12.统计信息查询
目前,sys租户可以通过前述的内部表来查询表和列的统计信息,下面的SQL给出了一个使用内部表查询表、列的统计信息的示例。使用该SQL可以通过传入数据库名、表名和列名这三个信息的组合获取到包括表的行数、列的NDV、列的null值数量以及列的最大最小值信息。

-- 内部表使用16进制格式存储最大值最小值信息,使用des_hex_str()函数可以将它转化为可读的格式。

select
  r_c as row_count,
  s.num_distinct as NDV, 
  s.num_null as num_null,
  des_hex_str(s.min_value) as min,
  des_hex_str(s.max_value) as max
from
  __all_column_statistic s,
  __all_database d,
  __all_table t,
  __all_column c,
  (select max(row_count)as r_c, table_id from __all_meta_table group by table_id) m
where
  s.table_id= t.table_id
  and t.database_id= d.database_id
  and d.database_name= 'tpch_1g'  -- 数据库名
  and t.table_name= 'orders'      -- 表名
  and c.table_id= t.table_id
  and c.column_name= 'o_orderkey' -- 列名
  and s.column_id= c.column_id
  and s.column_id= c.column_id
  and s.table_id= m.table_id;

-- 查询结果示例
+-----------+---------+----------+------+---------+
| row_count | NDV     | num_null | min  | max     |
+-----------+---------+----------+------+---------+
|   1500000 | 1479709 |        0 | 1    | 6000000 |
+-----------+---------+----------+------+---------+
1 row in set (0.14 sec)
 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值