您好,登錄后才能下訂單哦!
在Oralce里,一個sql語句執(zhí)行時會生成很多信息:
SQL唯一標識
SQL文本信息
綁定變量信息
執(zhí)行計劃和游標信息
統(tǒng)計信息
性能信息
其他信息.例如sql來源,狀態(tài)等
SQL_ID
在Oracle中,SQL優(yōu)化器是負責解析sql的(包括<a>直接執(zhí)行的sql和<b>存儲過程中的sql),<b>中的sql在提交sql優(yōu)化器解析前,會進行一些預(yù)處理,包括大小寫,空格,注釋的處理等。
在解析sql時,sql優(yōu)化器會分配一個ID(子游標),唯一標識一個sql(存儲在v$sql視圖內(nèi))。相同的sql文本sql_id是一樣的(對應(yīng)v$sqlarea中的數(shù)據(jù),稱它為父游標),即使是不同的數(shù)據(jù)庫實例中,這個以后在介紹。其他視圖通過這個id引用這個sql,在9i中對應(yīng)的是hash_value這個字段,11g中v$sql有字段old_hash_value對應(yīng)9i的hash_value,sql_id和hash_value是通過一定的算法計算出來的。
1.直接執(zhí)行的sql:
在sql_window下執(zhí)行
select /*test*/* from scott.emp e where e.empno = 10; select /*test*/* from scott.emp e where e.empno = 10; select /*test*/* from scott.emp E where e.empno = 10;
查詢他們的sql信息
select * from v$sql v where v.SQL_TEXT like '%/*test*/%';
可以看到如果兩個sql文本之間只要有任何的不同,就會生成不同的sql_id
2.存儲過程中的sql:
分靜態(tài)sql和動態(tài)sql兩種,動態(tài)sql和第一種直接執(zhí)行的sql一樣,我們關(guān)注一下靜態(tài)sql
declare v number; begin select /*+test1*/e.sal into v from scott.emp e where e.empno = 7369; select /*+test1*/e.sal into v from scott.emp e where e.empno = 7369; select /*+test1*/e.sal into v from scott.emp E where e.empno = 7369; end; /
執(zhí)行后,查詢sql信息,這里應(yīng)該使用提示/*+xxx*/,注釋會被過濾掉
從圖中可以看出,三個sql語句只生成了一個sql_id,說明plsql提交到sql優(yōu)化器的時候做了一些預(yù)處理。
如果使用綁定變量呢?我們來看看有什么變化
declare v dbms_sql.Number_Table; xx number; begin v(1) := 7369; v(1) := 7499; v(1) := 7521; for i in v.first .. v.last loop select /*+test2*/e.sal into xx from scott.emp e where e.empno = v(i); end loop; end; /
我們來看看sql_id情況
我們看到也是只有一條sql語句的sql_id信息。e.empno = v(i) 被替換成了 綁定變量:B,當sql被提交到內(nèi)存執(zhí)行的時候,才會替換為具體的值并執(zhí)行返回結(jié)果。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。