要确定具体的 SQL_ID
,您可以使用 GV$OB_SQL_AUDIT
视图来查询一段时间内的所有SQL语句及其相关信息。通过这些信息,您可以找到导致性能问题的具体SQL语句及其 SQL_ID
。以下是几种方法来确定 SQL_ID
:
方法一:查询所有SQL语句及其 SQL_ID
您可以查询 GV$OB_SQL_AUDIT
视图,获取一段时间内所有SQL语句的 SQL_ID
及其执行时间等信息。例如:
obclient> SELECT SQL_ID, COUNT(*), AVG(elapsed_time), MAX(elapsed_time), MIN(elapsed_time)
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE tenant_id = 1001
AND request_time > (time_to_usec(now()) - 1000000)
AND request_time < time_to_usec(now())
GROUP BY SQL_ID
ORDER BY AVG(elapsed_time) DESC
LIMIT 10;
这条SQL语句会返回最近1秒内执行的所有SQL语句的 SQL_ID
,并按平均执行时间降序排列,显示前10条记录。您可以根据这些信息找到执行时间较长的SQL语句及其 SQL_ID
。
方法二:查询特定时间段内耗时超过某个阈值的SQL
如果您已经知道某个时间段内存在性能问题,可以查询这段时间内耗时超过某个阈值的SQL语句。例如:
obclient> SELECT SQL_ID, elapsed_time, usec_to_time(request_time), substr(query_sql, 1, 50)
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE tenant_id = 1001
AND elapsed_time > 100000
AND request_time > time_to_usec('2021-10-08 12:00:00')
ORDER BY elapsed_time DESC
LIMIT 40;
这条SQL语句会返回2021年10月8日12:00:00之后,执行时间超过100毫秒的SQL语句及其 SQL_ID
,并按执行时间降序排列,显示前40条记录。
方法三:查询所有SQL语句的平均执行时间
您可以查询所有SQL语句的平均执行时间,找出执行时间最长的SQL语句。例如:
obclient> SELECT/*+ PARALLEL(15)*/avg_exe_usec, svr_ip, svr_port, sql_id, plan_id
FROM oceanbase.GV$OB_PLAN_CACHE_PLAN_STAT
WHERE tenant_id = 1001
ORDER BY avg_exe_usec DESC
LIMIT 3;
这条SQL语句会返回平均执行时间最长的前3条SQL语句及其 SQL_ID
。
综合分析
通过上述方法,您可以找到导致性能问题的具体SQL语句及其 SQL_ID
。然后,您可以将这些 SQL_ID
代入到您之前提到的SQL语句中,进一步分析这些SQL语句在各个节点上的执行情况。
希望这些方法能帮助您确定具体的 SQL_ID
并解决问题。如果还有其他疑问,请随时提问。
检索到的文档如下:
- GV$OB_SYS_TIME_MODEL
- 查询 SQL 流量分布情况及 QPS
- V$OB_SYS_TIME_MODEL
- 分析系统或某个 SQL 的执行是否出现大量不合理远程执行请求
- GV$OB_SQL_AUDIT
- 查询排名 TOP N 的 SQL
- 负载均衡
- GV$OB_KV_GROUP_COMMIT_STATUS
- V$OB_KV_GROUP_COMMIT_STATUS
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)