SQL问题的常用信息收集命令及解决思路 |OceanBase应用实践

面对SQL问题,大家的常用的分析思路是:

一、问题是否源于SQL本身?是的话需进行SQL调优。

二、SQL语句本身无误,但执行效果并未达到我们的预期效果。

  1. 检查当前的服务器负载状况,例如CPU利用率、内存占用、IO读写等关键指标。
  2. 确认是否存在数据库锁冲突问题
  3. 统计信息是否准确
  4. 考虑其他可能的场景因素

常用的信息收集

一、获取 trace_id 的方式

方法一:如果SQL可以执行成功,执行完第一步的sql后立即执行获取

select last_trace_id();

方法二:如果SQL执行失败,可以通过设置参数,失败后会返回信息(trace_id、执行节点等)

alter system set enable_rich_error_msg=true;   // 需要在sys租户下执行

方法三:直接通过 SQL 过滤 sql_audit

select * from oceanbase.GV$OB_SQL_AUDIT where query_sql like 'xxx%' order by REQUEST_TIME desc limit 5;

二、执行信息收集

1、OCP 平台业务租户监控截图,包括性能和主机监控

2、获取执行计划

explain extended sql

3、执行原始SQL,然后获取trace_id

select last_trace_id(); 获取trace id

4、获取 sql_audit

select * from oceanbase.GV$OB_SQL_AUDIT where TRACE_ID='xxx' order by REQUEST_TIME desc limit 5;

5、获取对应的observer log

通过 sql_audit 信息,到执行的节点下执行

grep 'xxx' observer.log*

6、获取 sql_monitor(local计划默认不会生成sql_monitor)

      1、sql 执行添加monitor hint:

select /*+ monitor */ * from xxx; delete /*+ monitor */ * from xxx;

      2、获取trace id

select last_trace_id();

      3、获取 sql_monitor,这里要替换traceid

select plan_line_id, plan_operation, sum(output_rows), sum(STARTS) rescan, min(first_refresh_time) open_time, max(last_refresh_time) close_time, max(last_refresh_time) - min(first_refresh_time) open_close_cost, min(first_change_time) first_row_time, max(last_change_time) last_row_eof_time, max(last_change_time) - min(first_change_time) rows_cost, count(1) from oceanbase.GV$SQL_PLAN_MONITOR where trace_id = 'xxxx' group by plan_line_id, plan_operation order by plan_line_id;

7、查询表的统计信息

select * from OCEANBASE.DBA_TAB_STATISTICS where table_name='xxx' \G

8、收集 explain trace 日志

set ob_log_level='TRACE';explain extend 原始sql;select last_trace_id();

然后用 trace id 捞一下日志

三、收集常见问题

如果日志没有查到记录,可能是因为日志级别设置的太高

show parameters like '%syslog_level%';set ob_log_level='TRACE';

也有可能日志限流以及刷新过快

alter system set syslog_io_bandwidth_limit='1G';alter system set max_syslog_file_count=15;

常见的问题解决思路

可以先收集下执行计划,然后再执行转储合并以及收集统计信息后重试,来排除这方面导致慢的可能。

收集统计信息

CALL dbms_stats.gather_table_stats('库名', '表名');

转储合并

转储:

alter system minor freeze;

查询转储信息,如果没有记录说明转储完成

SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_PROGRESS WHERE TYPE='MINI_MERGE'\G

合并:

ALTER SYSTEM MAJOR FREEZE;

查询合并状态,可以多查询几次,status 变成 idle 就可以了

SELECT * FROM oceanbase.CDB_OB_MAJOR_COMPACTION\G

sql_audit 判断

sql_audit 如果花费的时间都是 execute_time,就说明没有排队、堵塞等问题,这个时候就要看计划是否合理、sql是否可以优化。

根据 sql_monitor 中慢的部分再分析执行计划

举个🌰:

1714122406

估行不准

比如慢的算子部分 EST.ROWS 跟直接count 差别很大,尤其是用了 NLJ 的场景。

数据倾斜

带有业务特征的字段十有八九都会比较容易倾斜。比如:时间字段高度可疑,特别是这种2099年。

怀疑统计信息不准确可以尝试动态采样

动态采样为了使优化器得到足够多的统计信息,会在计划生成阶段针对数据库对象进行提前采样,通过采样的方式进行行数估计,从而用于代价模型中,生成更好的计划。

语句添加 /*+dynamic_sampling(1)*/ 这个hint执行

采集列的直方图

如果某些列的执行计划感觉有影响,可以确认列的统计信息是否准确

确认列的直方图收集情况,需要确认 HISTOGRAM 字段不为空。

select * from OCEANBASE.DBA_TAB_COL_STATISTICS where TABLE_NAME ='dim_scd_organization'\G

收集所有列的统计信息

call dbms_stats.gather_table_stats('库名', '表名', degree=>4, method_opt=>'for all columns size 256');

收集完成后再确认 OCEANBASE.DBA_TAB_COL_STATISTICS 的 HISTOGRAM 字段。

收集完可以再确认下sql的执行情况以及执行计划。

如果怀疑表关联顺序或者表关联算法有问题,可以通过 Hint 来指定。

如下为碰到的问题:

如果怀疑 NLJ(next-loop join) 慢,可以添加 Hint NO_USE_NL 关闭。

1714122434

比如这个例子,USE_NL (xxx),Hint 换成/*+ NO_USE_NL(@"SEL$D2F629B4" "dm"."dm_outpatient_medical_reduce1"@"SEL$1")*/

来让这个算子不走 NLJ,再查看执行效率以及执行计划

1714122448

如果执行结果不满足预期或者执行计划仍不是最优(比如:仍存在其他的nlj、关联顺序变化等),可以手动指定不合理的地方

/*+LEADING(@"SEL$D2F629B4" (("dw"."dim_scd_organization_province_code"@"SEL$1" "dm"."dm_outpatient_medical_reduce1"@"SEL$1") "dw"."dim_organization_level_level1_org_id"@"SEL$1")) USE_HASH(@"SEL$D2F629B4" "dw"."dim_organization_level_level1_org_id"@"SEL$1") USE_HASH(@"SEL$D2F629B4" "dm"."dm_outpatient_medical_reduce1"@"SEL$1")*/

这个 Hint 让 Leading 跟之前保持一致,dim_organization_level_level1_org_id 的关联算法也跟之前的保持一致,然后指定了 dm_outpatient_medical_reduce1 的关联算法由 USE_NL --> USE_HASH

1714122463

写在最后

SQL问题可能的原因其实有很多,解决SQL问题很多时候还是依靠经验,我这里提供的一些思路也只是冰山一角,建议大家碰到SQL问题可以记录下来,处理得多了以后就会形成自己的一套方法论,也就会越来越得心用手。

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

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

相关文章

[蓝桥杯 2021 省 AB2] 负载均衡

一.题目 题目描述 有 n 台计算机,第 i 台计算机的运算能力为 v i v_i vi​。 有一系列的任务被指派到各个计算机上,第 i 个任务在 a i a_i ai​ 时刻分配,指定计算机编号为 b i b_i bi​,耗时为 c i c_i ci​ 且算力消耗为…

敏感数据的授权和传输加密解决方案

需求背景:解决敏感数据的访问授权和安全传输。 KSP密钥管理系统结合USB Key实现CA证书签发的过程可以大致分为以下几个步骤: 1. 生成密钥对: 用户首先使用USB Key生成一对密钥,包括公钥和私钥。公钥用于加密和验证数字签名&…

教程来咯!如何在Windows10中设置代理IP?

很多用户在使用win10系统的时候,网络设置都是默认的,一般情况下代理服务器都是关闭的状态,而在一些特殊情况下,需要设置代理地址启动功能使用,有不少的用户不知道应该怎么进行设置添加,接下来就和各位用户们…

ansible 常用运维命令

文件传送 ## 传送文件 ansible all -m copy -a "src/tmp/aa.txt dest/tmp/aa.txt" -k## 文件夹传送 - hosts: alltasks:- name: Copy project files and delete extra filescopy:src: /path/to/your/project/dest: /opt/myappremote_src: yesstate: sync ansibe…

element plus 去掉select选择框的边框,并修改右侧图标

1.去掉选择框边框 ::v-deep .el-select__wrapper{ box-shadow: none; } ::v-deep .is-hovering{ box-shadow: none !important; }2.修改选择框右侧图标 新建CaretBottom.vue文件内容&#xff1a; <template><el-icon><CaretBottom /></el-icon> <…

逍遥散人的“痛婚”,让《光夜》玩家悄悄破防了

网红博主的一场求婚&#xff0c;让《光与夜之恋》玩家破防了。 知名游戏博主逍遥散人发微博公布求婚成功&#xff0c;本来应该是一件喜事&#xff0c;但却因为求婚场景布满了《光与夜之恋》男主角之一陆沉的谷子&#xff08;周边&#xff09;&#xff0c;遭到了“6推”&#x…

AI知识库和Agent简介及实现

AI知识库和Agent简介及实现 引言 随着人工智能的发展&#xff0c;大规模预训练模型&#xff08;Large Pre-trained Models&#xff0c;简称大模型&#xff09;成为了AI领域的重要研究方向。大模型通过大量的数据训练&#xff0c;能够在各种任务中展现出强大的性能。本文将重点…

深入解析多维数组与主对角线元素之和

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;多维数组的奥秘 二、多维数组的基本概念 1. 定义与创建 2. 维度与形…

Downie 4 for Mac:视频下载的新选择

对于Mac用户来说&#xff0c;想要轻松下载网上的视频内容&#xff0c;Downie 4无疑是一个绝佳的选择。这款专为Mac打造的视频下载工具&#xff0c;凭借其强大的功能和简洁的操作界面&#xff0c;让视频下载变得轻松又高效。 Downie 4支持从众多网站下载视频&#xff0c;包括各…

秋招突击——算法——模板题——区间DP(1)——加分二叉树

文章目录 题目描述思路分析实现代码分析总结 题目描述 思路分析 实现代码 不过我的代码写的真的不够简洁&#xff0c;逻辑不够清晰&#xff0c;后续多练练吧。 // 组合数问题 #include <iostream> #include <algorithm>using namespace std;const int N 35; int…

FreeSwitch视频会议同时支持内网和外网接入

我们在使用freeswitch进行视频会议时&#xff0c;之前所有的用户都是通过外网的方式接入&#xff0c;因为fs给其返回的sdp协议内容里&#xff0c;只需要fs配置的外网IP就可以了&#xff1b;最近由于引入新的业务需要有其他内网的服务器也可以直接接入fs的视频会议房间&#xff…

v4l2抓取rv1126图像

0.准备工作 本文是基于正点原子的rv1126开发板使用mx415摄像头对不同节点的图像进行抓取 1.数据流向 图1 mx415采集到的数据为原始的拜尔格式&#xff08;也就是raw格式&#xff09;&#xff0c;我们需要通过isp进行图像的调节才符合视觉&#xff0c;其中isp和ispp是两个处理的…

IT人的拖延——没兴趣又必须做怎么办?

人在职场,难免会被安排一些“不感兴趣”或者“觉得做了没什么意义或成就感”的事情,但是这些事情又被安排到自己身上不得不做了,于是人就难免有了拖延的迹象。这种拖延是“内在激励不足”导致的,因为从内心就觉得这个事情没什么挑战感,自己根本不感兴趣,或者就是重复的工…

异构图的连接预测三

异构图的连接预测三 总结&#xff1a; 做完了异构图的连接预测&#xff0c;我的疑虑还是挺多呢。 问题一&#xff1a; 为啥要使用’user’:self.user_emb(data[‘user’].node_id),生成用户的嵌入向量呢&#xff1f; 答&#xff1a;因为要使用到用户节点的特征&#xff0c;就是…

java中 stream()、parallelStream() 的区别对比,forEach()、forEachOrdered() 的区别对比

一、stream()、parallelStream()区别 1、数据准备 List<String> list = ListUtil.toList("2", "1", "3", "4", "5"); 2、stream() 示例 list.stream().forEach(item -> {System.out.println("stream.forEac…

zynq PS端 GPIO

记录一下PS端 GPIO 1. GPIO 简介 ZYNQ PS 中包含一组丰富的外设&#xff0c;用于和外部设备进行通信。ZYNQ 的 IO 包括对外连接的 GPIO 和内部 PS 与 PL 通信的 AXIO。其中对外的 GPIO 又分为两种&#xff1a;MIO 和 EMIO。 MIO 和 EMIO 只是 GPIO 信号的两种接口&#xff0c…

htop安装不了怎么解决

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

从零到一建设数据中台 - 数据可视化

从零到一建设数据中台(八)- 数据可视化 一、数据可视化大屏 数据可视化是借助于图形化手段,清晰有效地传达与沟通信息。 将一些业务的关键指标通过数据可视化的方式展示到一块或多块LED大屏上,以大屏为主要展示载体的数据可视化设计。 在数据可视化大屏构建过程中,为了…

排序(前篇)

1.排序的概念及其运用 2.插入排序的概念及实现 3.希尔排序的概念及实现 4.选择排序概念及实现 总代码&#xff08;对比各个排序在大量的数据情况排序所化的时间&#xff09;&#xff1a; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使…

SMS垃圾短信集F1指标分析

一、任务 SMS垃圾短信集是一组为研究SMS垃圾短信而收集数据集合&#xff0c;每条短信有两个信息&#xff0c;分别是标签信息label&#xff0c;其中spam为垃圾短信&#xff0c;ham为正常短信。以及message信息为短信内容。现在有训练集&#xff0c;训练集保存在E:\自然语言处理…