使用plsql_plprofiler 分析过程块的执行
前言:存储过程可能涉及很多的SQL及控制块,我们看到的执行时间是整个过程块的执行时间,如果我们认为性能有问题,我们只能逐条SQL的分析,查找问题SQL,效率非常低下。KingbaseES 提供了 plsql_plprofiler 扩展插件, 可以方便用户跟踪分析过程的每条语句的执行情况,能让我们快速定位问题。
以下以例子的方式演示plsql_plprofiler的使用。
1、创建扩展插件
create extension plsql_plprofiler
2、创建演示的存储过程
create or replace procedure p1 as
cnt integer;
begin
for i in 1..100 loop
select count(*) into cnt from t1;
end loop;
select count(*) into cnt from t2;
end;
/
3、收集数据
test=# select pl_profiler_reset_local(); --清理本地数据
pl_profiler_reset_local
------------------------- (1 row) test=# select pl_profiler_reset_shared(); --清理全局数据
pl_profiler_reset_shared
-------------------------- (1 row) test=# select pl_profiler_set_enabled_local(true); --启动本地会话分析器
pl_profiler_set_enabled_local
-------------------------------
t
(1 row) test=# call p1();
CALL
test=# select pl_profiler_set_enabled_local(false); --关闭本地会话分析器
pl_profiler_set_enabled_local
-------------------------------
f
(1 row) test=# select pl_profiler_collect_data();
pl_profiler_collect_data
--------------------------
0
(1 row)
4、分析数据
test=# select pl_profiler_func_oids_shared();
pl_profiler_func_oids_shared
------------------------------
{16485}
(1 row) test=# select func_oid, func_oid::regproc as funcname,line_number, source from pl_profiler_funcs_source(pl_profiler_func_oids_shared());
func_oid | funcname | line_number | source
----------+----------+-------------+---------------------------------------
16485 | p1 | 0 | -- Line 0
16485 | p1 | 1 |
16485 | p1 | 2 | cnt integer;
16485 | p1 | 3 | begin
16485 | p1 | 4 | for i in 1..100 loop
16485 | p1 | 5 | select count(*) into cnt from t1;
16485 | p1 | 6 | end loop;
16485 | p1 | 7 | select count(*) into cnt from t2;
16485 | p1 | 8 | end
(9 rows) SELECT L.func_oid::regproc as funcname,
L.func_oid as func_oid,
L.line_number,
sum(L.exec_count)::bigint AS exec_count,
sum(L.total_time)::bigint AS total_time,
max(L.longest_time)::bigint AS longest_time,
S.source
FROM pl_profiler_linestats_shared() L
JOIN pl_profiler_funcs_source(pl_profiler_func_oids_shared) S
ON S.func_oid = L.func_oid AND S.line_number = L.line_number
GROUP BY L.func_oid, L.line_number, S.source
ORDER BY L.func_oid, L.line_number;
funcname | func_oid | line_number | exec_count | total_time | longest_time | source
----------+----------+-------------+------------+------------+--------------+---------------------------------------
p1 | 16485 | 0 | 1 | 1296 | 1296 | -- Line 0
p1 | 16485 | 1 | 0 | 0 | 0 |
p1 | 16485 | 2 | 0 | 0 | 0 | cnt integer;
p1 | 16485 | 3 | 1 | 1294 | 1294 | begin
p1 | 16485 | 4 | 1 | 1098 | 1098 | for i in 1..100 loop
p1 | 16485 | 5 | 100 | 946 | 202 | select count(*) into cnt from t1;
p1 | 16485 | 6 | 0 | 0 | 0 | end loop;
p1 | 16485 | 7 | 1 | 193 | 193 | select count(*) into cnt from t2;
p1 | 16485 | 8 | 0 | 0 | 0 | end
(9 rows)
从收集到的数据可以某条SQL 执行次数、总执行时间(单位us)。
注意:控制块是包含内部所有语句的执行时间的,如:本例的for 循环
使用plsql_plprofiler 分析过程块的执行的更多相关文章
- Java的初始化块及执行过程详解
问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...
- 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- javascript引擎执行的过程的理解--执行阶段
一.概述 同步更新sau交流学习社区(nodeJSBlog):javascript引擎执行的过程的理解--执行阶段 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍 ...
- 九、dbms_ddl(提供了在PL/SQL块中执行DDL语句的方法)
1.概述 作用:提供了在PL/SQL块中执行DDL语句的方法,并且也提供了一些DDL的特殊管理方法. 2.包的组成 1).alter_compile说明:用于重新编译过程.函数和包语法:dbms_dd ...
- angularjs源码分析之:angularjs执行流程
angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,l ...
- 左右 Java 于 finally 深度分析语句块
首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题 ...
- LL(1)文法分析表的构造和分析过程示例
在考完编译原理之后才弄懂,悲哀啊.不过懂了就好,知识吗,不能局限于考试. 文法: E→TE' E'→+TE'|ε T→FT ' T'→*FT'|ε F→id| (E) 一.首先判断是不是 LL(1)文 ...
- 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程
今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...
- HDFS源码分析数据块校验之DataBlockScanner
DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独 ...
随机推荐
- python爬虫之protobuf协议介绍
前言 在你学习爬虫的知识过程中是否遇到下面的类型.如果有兴趣学习一下或者了解相关知识的,且不嫌在下才疏学浅,可以参考一下.欢迎各位网友的指正. 首先叙述一下问题的会出现的式样. 你可能会在请求参数中看 ...
- js 表面学习 - 认识结构2
单行注释以 // 开头. 多行注释以 /* 开头,以 */ 结尾. 任何位于 /* 和 */ 之间的文本都会被 JavaScript 忽略. JavaScript 数据类型 JavaScript 变量 ...
- Python在函数中使用列表作为默认参数
在学习中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作为函数的默认参 ...
- idea中创建Java类时,自动在文件头中添加作者和创建时间
在Settings中找到File and Code Templates 设置如下图所示. 效果展示:
- NC24866 [USACO 2009 Dec S]Music Notes
NC24866 [USACO 2009 Dec S]Music Notes 题目 题目描述 FJ is going to teach his cows how to play a song. The ...
- 面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读
SIGMOD 数据管理国际会议是数据库领域具有最高学术地位的国际性会议,位列数据库方向顶级会议之首.近日,腾讯云数据库团队的最新研究成果入选 SIGMOD 2022 Research Full Pap ...
- mybatis查询的三种方式
查询最需要关注的问题:①resultType自动映射,②方法返回值: interface EmpSelectMapper: package com.atguigu.mapper; import ja ...
- SpringMVC指定配置文件位置和名称,控制Servlet的加载时间
1. 2.
- SQL基本概念和SQL通用语法
SQL 1.什么是SQL? Structured Query Language:结构化查询语句 其实就是定义了操作所有关系型数据库的规则.每一种数据库操作的方式存在不一样的地方称为"方言&q ...
- Linux系列之管理用户环境变量
前言 环境变量控制你在Linux工作环境中的外观.行为和感觉.一共有两种类型的变量: 环境变量:这些是内置于系统中的进程范围的变量,控制着系统的外观和行为.因为是进程范围的,所以它们被任何子shell ...