需要優化的sql語句查詢

查詢前25條濫用磁盤讀操作最嚴重的語句:

set serveroutput on size 1000000

declare
  top25 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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章