日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL

發布時間:2024/10/14 数据库 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Oracle在解析SQL語句的時候,如果在共享池中發現匹配的SQL語句,就可以避免掉解析的大部分開銷。在共享池中找到匹配的SQL語句所對應的解析被稱為軟解析(soft parse)。如果沒有找到匹配的SQL語句,則必須進行硬解析(hard parse)。

硬解析不僅耗費CPU時間,在有大量會話想要同時緩存SQL語句到共享池時還會造成爭用。通過使用綁定變量,可以最小化解析的代價。

1.CURSOR_SHARING參數

該參數轉換SQL語句中的字面值到綁定變量。轉換值提高了游標共享,且可能會影響SQL語句的執行計劃。優化器是基于綁定變量的存在生成執行計劃,而不是實際字面量值。

CURSOR_SHARING決定什么類型的SQL語句可以共享相同的游標。CURSOR_SHARING參數有三個值:

FORCE:只要有可能,字面量就會被替換為綁定變量。

SIMILAR:只有當替換不會影響到執行計劃時,才會將字面量替換為綁定變量

EXACT:這是默認值。不將字面量替換為綁定變量。

注意:不推薦修改CURSOR_SHARING參數的默認值。如果實在無法修改現有應用的代碼,可以通過設置CURSOR_SHARING參數來指示Oracle透明地將字面量替換為綁定變量。

2.識別沒有使用綁定變量的SQL語句

利用v$sql視圖的FORCE_MATCHING_SIGNATURE字段,可以識別可能從綁定變量或CURSOR_SHARING獲益的SQL語句。如果SQL已使用綁定變量或者CURSOR_SHARING,則FORCE_MATCHING_SIGNATURE在對其進行標識時將給出同樣的簽名。換句話說,如果兩個SQL語句除了字面量的值之外都是相同的,它們將擁有相同的FORCE_MATCHING_SIGNATURE,這意味著如果為他們提供了綁定變量或者CURSOR_SHARING,它們就成了完全相同的語句。

使用FORCE_MATCHING_SIGNATURE識別沒有使用綁定變來的SQL語句。

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.通過執行動態SQL語句獲取綁定變量的好處

通過執行動態SQL語句,比較字面量和綁定參數對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視圖,比較執行結果:

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視圖中,發現使用字面量的SQL語句有14條,而使用綁定變量的SQL語句只有一條。其中使用字面量的SQL語句除以了字面量值不同之外,其他部分都是相同。而FORCE_MATCHING_SIGNATURE的值是在假設該SQL語句使用綁定變量或者CURSOR_SHARING得到的,因此通過FORCE_MATCHING_SIGNATURE字段識別沒有綁定變量的SQL語句。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。