oracle之SQL_ID 1

在Oralce裏,一個sql語句執行時會生成不少信息:
算法

  • SQL惟一標識sql

  • SQL文本信息數據庫

  • 綁定變量信息ide

  • 執行計劃和遊標信息oop

  • 統計信息性能

  • 性能信息優化

  • 其餘信息.例如sql來源,狀態等
    spa


SQL_IDblog

    在Oracle中,SQL優化器是負責解析sql的(包括<a>直接執行的sql和<b>存儲過程當中的sql),<b>中的sql在提交sql優化器解析前,會進行一些預處理,包括大小寫,空格,註釋的處理等。圖片

    在解析sql時,sql優化器會分配一個ID(子游標),惟一標識一個sql(存儲在v$sql視圖內)。相同的sql文本sql_id是同樣的(對應v$sqlarea中的數據,稱它爲父遊標),即便是不一樣的數據庫實例中,這個之後在介紹。其餘視圖經過這個id引用這個sql,在9i中對應的是hash_value這個字段,11g中v$sql有字段old_hash_value對應9i的hash_value,sql_id和hash_value是經過必定的算法計算出來的。


1.直接執行的sql:

  在sql_window下執行 

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*/%';

wKioL1fMMZbBV6MwAAF6kl2c2kE025.png-wh_50

能夠看到若是兩個sql文本之間只要有任何的不一樣,就會生成不一樣的sql_id


2.存儲過程當中的sql:

  分靜態sql和動態sql兩種,動態sql和第一種直接執行的sql同樣,咱們關注一下靜態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;
/

  執行後,查詢sql信息,這裏應該使用提示/*+xxx*/,註釋會被過濾掉

wKiom1fMNlnBPl2wAAFQre3OB28926.png-wh_50

從圖中能夠看出,三個sql語句只生成了一個sql_id,說明plsql提交到sql優化器的時候作了一些預處理。


若是使用綁定變量呢?咱們來看看有什麼變化

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狀況

wKioL1fMOAjBYDHoAAFggtxCBTY033.png-wh_50

咱們看到也是隻有一條sql語句的sql_id信息。e.empno = v(i) 被替換成了 綁定變量:B,當sql被提交到內存執行的時候,纔會替換爲具體的值並執行返回結果。

相關文章
相關標籤/搜索