一现网数据库cpu经常告警,从statspack报告中可以看到如下的语句消耗了大量的IO和CPU资源:
SELECT NVL(MAX(MENUSEQ),0) FROM MENU WHERE PORTALTYPEID = 4 AND PARENTMENUID = :B1;
初一看,这个查询语句明显应该是应用所发出的,不应该是后台程序,因为后台程序的话需有into variable才行。
[@more@]查询后台程序的脚本,发现语句“select nvl(max(menuseq),0) into v_maxmenuseq from menu where portaltypeid = 4 and parentmenuid = v_parentmenuid;”确实存在,莫非statspack中的语句就是这个语句?
难道PL/SQL中的into variable不会体现在statspack中?
带着这个疑问我做了一个小测试,如下:
create table into_test
(
num number(8)
);
CREATE OR REPLACE PROCEDURE proc_test_select_into
AS
v_maxmenuseq number; --菜单序列号
v_a number;
BEGIN
for v_a in 1 .. 1000000
loop
select nvl(max(menuseq),0) into v_maxmenuseq from menu where portaltypeid = 4 and parentmenuid = v_a;
insert into into_test values(v_maxmenuseq);
commit;
end loop;
commit;
return;
EXCEPTION
when OTHERS then
rollback;
END proc_test_select_into;
/
exec proc_test_select_into;
在执行proc_test_select_into的前后,做了两次snap。
top sql中有如下的结果:
Module: PL/SQL Developer
SELECT NVL(MAX(MENUSEQ),0) FROM MENU WHERE PORTALTYPEID = 4 AND
PARENTMENUID = :B1
268,583 132,366 2.0 10.5 24.73 32.05 1630224389
Module: PL/SQL Developer
INSERT INTO INTO_TEST VALUES(:B1 )
174,919 29 6,031.7 6.8 2.72 3.53 69608699
可看出的确PL/SQL中的into variable不会体现在statspack中。
其他应用中发出的into variable是会体现在statspack中的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/38542/viewspace-929629/ ,如需转载,请注明出处,否则将追究法律责任。