web-dev-qa-db-ja.com

dbms_sqlを使用して、ステートメントへの挿入の分析を取得する方法

declare 
 v_cursor number;
 stmt varchar2(2000);
 s varchar2(40);
 cursor cc1 is select voc.SQL_ID from v$open_cursor voc left join v$sql vs on voc.SQL_ID=vs.SQL_ID  where voc.SID in(select sid from v$mystat) and to_char(substr(vs.SQL_FULLTEXT,1,2000)=stmt;
begin
delete from table1;
v_cursor:=dbms_sql.open_cursor;
stmt:='inset into table2 (column1,column2) values(''a'',''b'')';
dbms_sql.parse(v_cursor,stmt,dbms_sql.native);
insert into table1 select * from tables(dbms_xplan.display
open cc1;
loop
fetch cc1 into s;
exit;
end loop;
close cc1;
insert into table1 select * from(dbms_xplan.display_cursor(s,0,'ALL'));

これを実行してtable1から選択しますが、table1のレコードから次のことがわかります。

プランがカーソルキャッシュに存在しない可能性もあります(v $ sql_planを確認してください)。

しかし、stmtを変更してステートメントを更新して実行すると、table1のレコードは正しいです。だから私は挿入ステートメントについてどこで分析を得ることができるか知りたいです。

1
user32118

child_numberへのdbms_xplan.display_cursor引数もv$sqlから取得する必要があり、必ずしもゼロである必要はありません。 (その数に何が影響するかは正確にはわかりませんが、例でtable2を削除して再作成すると、毎回新しいchild_numberが得られます)。

これがあなたの手順の修正版です(あなたが上に持っているもののいくつかのタイプミスを修正しました):

DECLARE
  v_cursor NUMBER;
  stmt     VARCHAR2(2000);
  s        VARCHAR2(40);
  cn       NUMBER;
  CURSOR cc1
  IS
    SELECT voc.SQL_ID, vs.child_number
    FROM v$open_cursor voc
    LEFT JOIN v$sql vs
    ON voc.SQL_ID  =vs.SQL_ID
    WHERE voc.SID IN (SELECT sid FROM v$mystat)
      AND TO_CHAR(SUBSTR(vs.SQL_FULLTEXT,1,2000))=stmt;
BEGIN
  DELETE FROM table1;
  v_cursor:=dbms_sql.open_cursor;
  stmt    :='insert into table2 values (''a'',''b'')';
  dbms_sql.parse(v_cursor,stmt,dbms_sql.native);
  OPEN cc1;
  LOOP
    FETCH cc1 INTO s, cn;
    EXIT;
  END LOOP;
  CLOSE cc1;
  -- To inspect the child number:
  -- dbms_output.put_line(s || ' '|| cn); 
  INSERT INTO table1 SELECT * FROM table(dbms_xplan.display_cursor(s,cn,'ALL'));
END;
/
1
Mat