Oracle SQL硬解析和软解析示例

Oracle的软解析会把预处理的sql放到SGA(共享池)中,避免每次都让oracle做优化和生成查询计划;在Java程序中通常使用预处理语句,不让数据库走硬解析;
 
下面是使用绑定变量的软解析和硬解析示例:
CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
  FOR i IN 1..10000
  LOOP
   -- 绑定变量,软解析
    EXECUTE IMMEDIATE 'insert into t values(:x)' USING i;
  END LOOP;
END;
/


-- 硬解析
EXECUTE IMMEDIATE 'insert into t values('||i||')';

 

在Oracle中可以通过下面的SQL检查哪些业务SQL没有绑定变量,导致走了硬解析耳没有发挥SQL的最佳性能:

SELECT distinct to_char(FORCE_MATCHING_SIGNATURE) FORCE_MATCHING_SIGNATURE, SQL_TEXT
FROM (select SQL_ID,
SQL_TEXT,
Q.FORCE_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE,
row_number() over(partition by Q.FORCE_MATCHING_SIGNATURE order by Q.FORCE_MATCHING_SIGNATURE) S_ROW_NUM
FROM V$SQL Q
WHERE FORCE_MATCHING_SIGNATURE > 100
and parsing_schema_name not in
('MGMT_VIEW',
'SYSMAN',
'MDDATA',
'OLAPSYS',
'ORDSYS',
'ORDPLUGINS',
'SI_INFORMTN_SCHEMA',
'MDSYS',
'ANONYMOUS',
'XDB',
'CTXSYS',
'DMSYS',
'EXFSYS',
'WMSYS',
'ORACLE_OCM',
'DBSNMP',
'TSMSYS',
'DIP',
'OUTLN',
'SYS',
'SYSTEM'))
WHERE S_ROW_NUM BETWEEN 105 AND 107
ORDER BY FORCE_MATCHING_SIGNATURE;
★★★★★★好记性不如烂笔头★★★★★★
原文地址:https://www.cnblogs.com/fubinhnust/p/9925884.html