查詢前25條濫用磁盤讀操作最嚴重的語句:
set serveroutput on size 1000000
declaretop25 number;
text1 varchar2(4000);
x number;
len1 number;
cursor c1 is
select disk_reads, substr(sql_text, 1, 4000)
from v$sqlarea
order by disk_reads desc;
begin
dbms_output.put_line('Reads' || ' ' || 'text');
dbms_output.put_line('-----------' || ' ' || '-------------------------');
open c1;
for i in 1 .. 25 loop
fetch c1
into top25, text1;
dbms_output.put_line(rpad(to_char(top25), 9) || ' ' ||
substr(text1, 1, 66));
len1 := length(text1);
x := 66;
while len1 > x - 1 loop
dbms_output.put_line('"' || substr(text1, x, 66));
x := x + 66;
end loop;
end loop;
end;
查詢最濫用磁盤讀操作的前10條語句所佔所有語句磁盤讀的比例:
set serveroutput on
declare
cursor c1 is
select disk_reads from v$sqlarea order by disk_reads desc;
cursor c2 is
select sum(disk_reads) from v$sqlarea;
sumof10 number := 0;
mydr number;
mytotdr number;
begin
dbms_output.put_line('Percent');
dbms_output.put_line('----------');
open c1;
for i in 1 .. 10 loop
fetch c1
into mydr;
sumof10 := sumof10 + mydr;
end loop;
close c1;
open c2;
fetch c2
into mytotdr;
close c2;
dbms_output.put_line(sumof10 / mytotdr * 100);
end;
查詢前25位內存濫用的語句:
set serveroutput on size 1000000
declare
top25 number;
text1 varchar2(4000);
x number;
len1 number;
cursor c1 is
select buffer_gets, substr(sql_text, 1, 4000)
from v$sqlarea
order by buffer_gets desc;
begin
dbms_output.put_line('Get' || ' ' || 'Text');
dbms_output.put_line('----------------' || ' ' || '------------');
open c1;
for i in 1 .. 25 loop
fetch c1
into top25, text1;
dbms_output.put_line(rpad(to_char(top25), 9) || ' ' ||
substr(text1, 1, 66));
len1 := length(text1);
x := 66;
while len1 > x - 1 loop
dbms_output.put_line('"' || substr(text1, x, 66));
x := x + 66;
end loop;
end loop;
end;
查詢“10大內存濫用”語句在所有語句中所佔比重:
set serveroutput on
declare
cursor c1 is
select buffer_gets from v$sqlarea order by buffer_gets desc;
cursor c2 is
select sum(buffer_gets) from v$sqlarea;
sumof10 number := 0;
mybg number;
mytotbg number;
begin
dbms_output.put_line('Percent');
dbms_output.put_line('-------------');
open c1;
for i in 1 .. 10 loop
fetch c1
into mybg;
sumof10 := sumof10 + mybg;
end loop;
close c1;
open c2;
fetch c2
into mytotbg;
close c2;
dbms_output.put_line(sumof10 / mytotbg * 100);
end;