In PL/SQL,the statement of "into variable" wasn't appeared in statspack

shiyihai發表於2007-07-31

一現網資料庫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部落格 ” ,連結:http://blog.itpub.net/38542/viewspace-929629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章