【基礎篇基本原理】sql執行過程

yellowlee發表於2010-07-14

Sql執行過程

Sql的具體執行過程大致為:

建立並開啟一個遊標,伺服器程式為這個遊標分配記憶體結構;

分析語句,進行語法,語義訪問許可權的檢查,確認sql語句是否符合語法規則,所引用的物件(表,檢視,自定義函式等)是否都存在,當前使用者是否有許可權訪問;將父遊標快取到library cache,生成新的sql,搜尋是否有可重用的執行計劃,如果沒有則生成,即為子游標,然後將父遊標與子游標關聯;如果前面的父遊標和子游標都可用,那麼則跳過這兩步,整個解析過程就是軟解析,否則就是硬解析。

繫結變數(如果需要),處理查詢(定義列,執行,獲取行,返回列值或變數值)或者直接執行,最後關閉遊標。

 

用一個簡單的查詢來看這個過程,比如:

SQL> set serveroutput on

SQL>

SQL> var empno number;

SQL> exec :empno := 7369;

 

PL/SQL procedure successfully completed

empno

---------

7369

 

SQL> select empno from scott.emp where empno = :empno;

 

EMPNO

-----

 7369

empno

---------

7369

 

下面是大致對上面的語句的執行過程進行顯示的編碼:

 

SQL> declare

  2    l_cursor number;

  3    v_empno  scott.emp.empno%type;

  4    num      number;

  5  begin

  6    l_cursor := dbms_sql.open_cursor;

  7    dbms_sql.parse(l_cursor,

  8                   'select empno from scott.emp where empno = :empno',

  9                   dbms_sql.native);

 10    dbms_sql.bind_variable(l_cursor, ':empno', 7369);

 11    dbms_sql.define_column(l_cursor, 1, v_empno);

 12    num := dbms_sql.execute(l_cursor);

 13    if dbms_sql.fetch_rows(l_cursor) > 0 then

 14      dbms_sql.column_value(l_cursor, 1, v_empno);

 15    end if;

 16    dbms_output.put_line(v_empno);

 17    dbms_sql.close_cursor(l_cursor);

 18  end;

 19  /

 

7369

 

PL/SQL procedure successfully completed

上面提到的library cache即庫快取,屬於sharedpool,主要用來存放使用者提交的sql語句,sql語句相關的解析資訊,執行計劃,plsql(包,函式,儲存過程等)以及被轉換後重新生成的可被oracle執行的程式碼。從v$librarycache檢視中可以看到這些資訊:

 

SQL> select a.NAMESPACE,

  2         a.GETS,

  3         --a.GETHITS,

  4         trunc(a.GETHITRATIO,3) GETHITRATIO,

  5         a.PINS,

  6         --a.PINHITS,

  7         trunc(a.PINHITRATIO,3) PINHITRATIO,

  8         a.RELOADS

  9    from v$librarycache a;

 

NAMESPACE             GETS GETHITRATIO       PINS PINHITRATIO    RELOADS

--------------- ---------- ----------- ---------- ----------- ----------

SQL AREA            100422       0.932     822362       0.986        613

TABLE/PROCEDURE      25052       0.885     160475       0.963       1121

BODY                 60780       0.998      80434       0.999          0

TRIGGER               2239       0.988      19637       0.998          0

INDEX                  766       0.432       3993       0.831          0

CLUSTER                310        0.97        798       0.988          0

OBJECT                   0           1          0           1          0

PIPE                     0           1          0           1          0

JAVA SOURCE              0           1          0           1          0

JAVA RESOURCE            0           1          0           1          0

JAVA DATA                0           1          0           1          0

 

11 rows selected

 

欄位解釋如下:

NAMESPACE 庫快取名稱空間

GETS  物件請求的鎖的次數

GETHITS 物件控制程式碼在記憶體中被找到的次數

GETHITRATIO  gethit的比率(GETHITS/GETS

PINS 物件請求pin的次數

PINHITS 庫物件在記憶體中被找到的次數

PINHITRATIO pinhit的比率(PINHITS/PINS

RELOADS disk中的load

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-668022/,如需轉載,請註明出處,否則將追究法律責任。

相關文章