oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL
Oracle在解析SQL語(yǔ)句的時(shí)候,如果在共享池中發(fā)現(xiàn)匹配的SQL語(yǔ)句,就可以避免掉解析的大部分開銷。在共享池中找到匹配的SQL語(yǔ)句所對(duì)應(yīng)的解析被稱為軟解析(soft parse)。如果沒有找到匹配的SQL語(yǔ)句,則必須進(jìn)行硬解析(hard parse)。
硬解析不僅耗費(fèi)CPU時(shí)間,在有大量會(huì)話想要同時(shí)緩存SQL語(yǔ)句到共享池時(shí)還會(huì)造成爭(zhēng)用。通過使用綁定變量,可以最小化解析的代價(jià)。
1.CURSOR_SHARING參數(shù)
該參數(shù)轉(zhuǎn)換SQL語(yǔ)句中的字面值到綁定變量。轉(zhuǎn)換值提高了游標(biāo)共享,且可能會(huì)影響SQL語(yǔ)句的執(zhí)行計(jì)劃。優(yōu)化器是基于綁定變量的存在生成執(zhí)行計(jì)劃,而不是實(shí)際字面量值。
CURSOR_SHARING決定什么類型的SQL語(yǔ)句可以共享相同的游標(biāo)。CURSOR_SHARING參數(shù)有三個(gè)值:
FORCE:只要有可能,字面量就會(huì)被替換為綁定變量。
SIMILAR:只有當(dāng)替換不會(huì)影響到執(zhí)行計(jì)劃時(shí),才會(huì)將字面量替換為綁定變量
EXACT:這是默認(rèn)值。不將字面量替換為綁定變量。
注意:不推薦修改CURSOR_SHARING參數(shù)的默認(rèn)值。如果實(shí)在無法修改現(xiàn)有應(yīng)用的代碼,可以通過設(shè)置CURSOR_SHARING參數(shù)來指示Oracle透明地將字面量替換為綁定變量。
2.識(shí)別沒有使用綁定變量的SQL語(yǔ)句
利用v$sql視圖的FORCE_MATCHING_SIGNATURE字段,可以識(shí)別可能從綁定變量或CURSOR_SHARING獲益的SQL語(yǔ)句。如果SQL已使用綁定變量或者CURSOR_SHARING,則FORCE_MATCHING_SIGNATURE在對(duì)其進(jìn)行標(biāo)識(shí)時(shí)將給出同樣的簽名。換句話說,如果兩個(gè)SQL語(yǔ)句除了字面量的值之外都是相同的,它們將擁有相同的FORCE_MATCHING_SIGNATURE,這意味著如果為他們提供了綁定變量或者CURSOR_SHARING,它們就成了完全相同的語(yǔ)句。
使用FORCE_MATCHING_SIGNATURE識(shí)別沒有使用綁定變來的SQL語(yǔ)句。
with force_mathces as
(select l.force_matching_signature mathces,
max(l.sql_id || l.child_number) max_sql_child,
dense_rank() over(order by count(*) desc) ranking
from v$sql l
where l.force_matching_signature <> 0
and l.parsing_schema_name <> 'SYS'
group by l.force_matching_signature
having count(*) > 10)
select v.sql_id, v.sql_text, v.parsing_schema_name, fm.mathces, fm.ranking
from force_mathces fm, v$sql v
where fm.max_sql_child = (v.sql_id || v.child_number)
and fm.ranking <= 5
order by fm.ranking;
3.通過執(zhí)行動(dòng)態(tài)SQL語(yǔ)句獲取綁定變量的好處
通過執(zhí)行動(dòng)態(tài)SQL語(yǔ)句,比較字面量和綁定參數(shù)對(duì)SQL解析的影響。
declare
v_ename emp.ename%type;
v_sal?? emp.sal%type;
v_sql?? clob;
begin
dbms_output.put_line('*********使用字面量************');
for vrt_emp in (select * from emp) loop
v_sql := 'select e.ename,e.sal from emp e where e.empno =' ||
vrt_emp.empno;
execute immediate v_sql
into v_ename, v_sql;
dbms_output.put_line(v_ename || ':' || v_sql);
end loop;
dbms_output.put_line('');
dbms_output.put_line('*********使用綁定變量************');
for vrt_emp in (select * from emp) loop
v_sql := 'select e.ename,e.sal from emp e where e.empno =:empno';
execute immediate v_sql
into v_ename, v_sql
using vrt_emp.empno;
dbms_output.put_line(v_ename || ':' || v_sql);
end loop;
end;
查詢v$sql視圖,比較執(zhí)行結(jié)果:
SQL> select v.sql_text, v.sql_id, v.force_matching_signature
2??? from v$sql v
3?? where v.sql_text like 'select e.ename,e.sal from emp e where e.empno %';
SQL_TEXT??????????????????????????????????????????????????????SQL_ID??????? FORCE_MATCHING_SIGNATURE
---------------------------------------------------------???-------------- ------------------------
select e.ename,e.sal from emp e where e.empno =7782???????? 766syjydcn5fh????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7499???????? 6ymy4hcb386vt????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7934?????????3t96y707p8by7????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7902???????? f9pyzxf7tnuzw????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7654?????????fvk1fzmrvjc4j????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7788?????????gsmatg9f4jd2z????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7566?????????4q9pzzpvvdpuu????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7369?????????3xhqmvm5vdqy0????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7698?????????bjjjw0gzaprzv????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7876?????????8nd8v8mrzxw4w????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7521?????????5tnyy066zfk1b????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7844???????? 4kd7jb013g2zz????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7900?????????grx9sh4fwrcwx????? 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =:empno???????20wmyr4cvrr6k????? 3.49355109645567E18
select e.ename,e.sal from emp e where e.empno =7839?????????6u2ajyu05gw9s????? 1.27397653964533E19
在v$sql視圖中,發(fā)現(xiàn)使用字面量的SQL語(yǔ)句有14條,而使用綁定變量的SQL語(yǔ)句只有一條。其中使用字面量的SQL語(yǔ)句除以了字面量值不同之外,其他部分都是相同。而FORCE_MATCHING_SIGNATURE的值是在假設(shè)該SQL語(yǔ)句使用綁定變量或者CURSOR_SHARING得到的,因此通過FORCE_MATCHING_SIGNATURE字段識(shí)別沒有綁定變量的SQL語(yǔ)句。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle jdedward,Orac
- 下一篇: MySQL / 为什么需要主键?主键为什