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;