【基礎篇基本原理】sql執行過程
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql 執行過程SQL
- sql執行過程分析SQL
- SQL Server基礎:儲存過程SQLServer儲存過程
- 一條Sql的執行過程SQL
- mysql執行sql語句過程MySql
- CPU亂序執行基礎 —— Tomasulo演算法及執行過程演算法
- SQL Server基礎之儲存過程SQLServer儲存過程
- 程式執行緒篇——程式執行緒基礎執行緒
- Java多執行緒-基礎篇Java執行緒
- 黑盒基礎之用例執行篇
- SQL語句執行過程詳解SQL
- CoreData執行過程的sql語句SQL
- sql語句執行過程小結SQL
- 剖析SQL語句的執行過程SQL
- Oracle SQL 語句的執行過程OracleSQL
- 【SQL】Oracle避免動態SQL,提高過程執行效率SQLOracle
- 【JAVA】【面試】【基礎篇】- 執行緒、鎖Java面試執行緒
- JAVA多執行緒-基礎篇-synchronizedJava執行緒synchronized
- 一條sql語句的執行過程SQL
- 一條 sql 的執行過程詳解SQL
- MySQL 中一條 sql 的執行過程MySql
- mybatis-spring sql執行過程分析MyBatisSpringSQL
- 淺談SQL語句的執行過程SQL
- 10_SQL語句執行過程剖析SQL
- 理解oracle執行sql語句的過程OracleSQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- maven外掛執行過程中自動執行sql檔案MavenSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- [MSSQL]sql 儲存過程定時執行方法SQL儲存過程
- GaussDB SQL查詢語句執行過程解析SQL
- 【基礎篇基本原理】資料訪問方式
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- Mysql之一次完成的sql執行過程MySql
- Java 執行緒基礎,從這篇開始Java執行緒
- (一)基礎篇:速讀Java執行緒池Java執行緒
- 多執行緒基礎練習實踐篇執行緒
- java多執行緒程式設計--基礎篇Java執行緒程式設計
- Oracle DDL 執行過程Oracle