天天看點

如何找出未使用綁定變量的SQL

SQL開發的過程中,如果不使用綁定變量,會對資料庫性能造成非常嚴重的影響請看如下示例代碼:

  begin

  for i in 1..1000 loop

  execute immediate 'insert into test values('||i||')';

  end loop;

  commit;

   end;

  /

該過程執行1000次,會解析1000次,我們知道每次SQL解析大概會占用一條SQL語句執行時間的70%左右,而且過多的硬解析會在SHARED POOL 中産生很多碎片,導緻ORA-04031錯誤,那麼如何判斷應用程式中是否使用了綁定變量呢?我們可以通過V$SQLAREA視圖來檢視應用程式中是否使 用了綁定變量,下面簡單舉個例子:

SQL> create table test(id number );

Table created.

SQL>  begin

  for i in 1..1000 loop

  execute immediate 'insert into test values('||i||')';

  end loop;

  commit;

   end;

  /

PL/SQL procedure successfully completed.

SQL> select substr(sql_text,1,20), count(*)

          from v$sqlarea

         group by substr(sql_text,1,20) having count(*) > 50; 

SUBSTR(SQL_TEXT,1,20)             COUNT(*)

-----------------------------            ---------------

insert into test val                       1000

可以看到insert into test.......這條語句竟然在shared pool裡面解析了1000次,通過如下查詢

select sql_text from v$sqlarea where sql_text like 'insert into test %';找出具體的sql代碼,然後與開發人員商量,更改SQL代碼。

上面隻是一個簡單的執行個體,具體要怎麼檢視你的應用是否使用了綁定變量,隻需要簡單修改