查询前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;