ORACLE 查詢語句處理過程(
語句執行過程:
首先session連線:透過CS/或者三層結構:客戶端 user process----server process
Oracle會為每個使用者程式分配一個伺服器程式:service process(實際情況應該區分專用伺服器和共享伺服器),當service
process接收到使用者程式提交的sql語句時,伺服器程式會對sql語句進行語法和詞法分析。
第1步: 建立遊標(Create a Cursor)
由程式介面呼叫建立一個遊標(cursor)。任何SQL語句都會建立它,特別在執行DML語句時,都是自動建立遊標的,不需要開發人員干預。多數應用中,遊標的建立是自動的。然而,在預編譯程式(pro*c)中游標的建立,可能是隱含的,也可能顯式的建立。在儲存過程中也是這樣的。
第2步:分析語句(Parse the Statement)
這裡分為語法和語句解析
首先判斷是否在shared pool裡相同的SQL;這主要是透過繫結變數(bind variable)實現的,也就是我們常說的共享SQL,---why
shared pool
如果有--就直接拿之即用
如果沒有
2.1 驗證它是合法的語句,即書寫正確
2.2 實現資料字典的查詢,以驗證是否符合表和列的定義-----why 有資料字典緩衝區
2.3 在所要求的物件上獲取語法分析鎖,使得在語句的語法分析過程中不改變這些物件的定義
2.4 驗證為存取所涉及的模式物件所需的許可權是否滿足----why 有資料字典緩衝區
第3步: 描述查詢結果(Describe Results of a Query)
描述階段只有在查詢結果的各個列是未知時才需要;例如,當查詢由使用者互動地輸入需要輸出的列名。在這種情況要用描述階段來決定查詢結果的特徵(資料型別,長度和名字)。
第4步: 定義查詢的輸出資料(Define Output of a Query)
在查詢的定義階段,你指定與查詢出的列值對應的接收變數的位置、大小和資料型別,這樣我們透過接收變數就可以得到查詢結果。如果必要的話,Oracle會自動實現資料型別的轉換。這是將接收變數的型別與對應的列型別相比較決定的。
第5步: 繫結變數(Bind Any Variables)
此時,Oracle知道了SQL語句的意思,但仍沒有足夠的資訊用於執行該語句。Oracle
需要得到在語句中列出的所有變數的值。在該例中,Oracle需要得到對department_id列進行限定的值。得到這個值的過程就叫繫結變數(binding
variables)
此過程稱之為將變數值捆綁進來。程式必須指出可以找到該數值的變數名(該變數被稱為捆綁變數,變數名實質上是一個記憶體地址,相當於指標)。應用的終端使用者可能並沒有發覺他們正在指定捆綁變數,因為Oracle
的程式可能只是簡單地指示他們輸入新的值,其實這一切都在程式中自動做了。
因為你指定了變數名,在你再次執行之前無須重新捆綁變數。你可以改變繫結變數的值,而Oracle在每次執行時,僅僅使用記憶體地址來查詢此值。
如果Oracle
需要實現自動資料型別轉換的話(除非它們是隱含的或預設的),你還必須對每個值指定資料型別和長度。關於這些資訊可以參考oracle的相關文件,如Oracle
Call Interface Programmer's Guide
第6步: 並行執行語句(Parallelize the Statement )
ORACLE 可以在SELECTs, INSERTs, UPDATEs, MERGEs,
DELETEs語句中執行相應並行查詢操作,對於某些DDL操作,如建立索引、用子查詢建立表、在分割槽表上的操作,也可以執行並行操作。並行化可以導致多個伺服器程式(oracle
server processes)為同一個SQL語句工作,使該SQL語句可以快速完成,但是會耗費更多的資源,所以除非很有必要,否則不要使用並行查詢。
到了現在這個時候,Oracle擁有所有需要的資訊與資源,因此可以真正執行SQL語句了。如果該語句為SELECT查詢或INSERT語句,則不需要鎖定任何行,因為沒有資料需要被改變。然而,如果語句為UPDATE或DELETE語句,則該語句影響的所有行都被鎖定,防止該使用者提交或回滾之前,別的使用者對這些資料進行修改。這保證了資料的一致性。
對於某些語句,你可以指定執行的次數,這稱為批處理(array
processing)。指定執行N次,則繫結變數與定義變數被定義為大小為N的陣列的開始位置,這種方法可以減少網路開銷,也是最佳化的技巧之一。
第8步: 取出查詢的行(Fetch Rows of a Query)
在fetch階段,行資料被取出來,每個後續的存取操作檢索結果集中的下一行資料,直到最後一行被取出來。上面提到過,批次的fetch是最佳化的技巧之一。
第9步: 關閉遊標(Close the Cursor)
SQL語句處理的最後一個階段就是關閉遊標
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/500314/viewspace-1063658/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DML 語句處理過程
- SQL語句的處理過程SQL
- Oracle一個SQL語句的處理過程(轉)OracleSQL
- SQL語句的處理過程修正SQL
- Oracle釋出一個SQL語句的處理過程OracleSQL
- Oracle 單個表查詢速度極慢處理過程Oracle
- MySQL 查詢語句執行過程淺析MySql
- GaussDB SQL查詢語句執行過程解析SQL
- SQL查詢語句 (Oracle)SQLOracle
- oracle查詢語句大全Oracle
- oracle分頁查詢語句Oracle
- Oracle常用的查詢語句Oracle
- oracle--06查詢語句Oracle
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- 小覷資料庫(SqlServer)查詢語句執行過程資料庫SQLServer
- 查詢處理死鎖會話的sql語句(轉貼)會話SQL
- ORACLE結構化查詢語句Oracle
- Oracle分頁查詢語句(七)Oracle
- Oracle分頁查詢語句(六)Oracle
- Oracle分頁查詢語句(五)Oracle
- Oracle分頁查詢語句(四)Oracle
- Oracle分頁查詢語句(三)Oracle
- Oracle分頁查詢語句(二)Oracle
- Oracle分頁查詢語句(一)Oracle
- MySQL查詢語句過程和EXPLAIN語句的基本概念及其最佳化MySqlAI
- oracle 死鎖查詢處理Oracle
- MySQL系列之一條SQL查詢語句的執行過程MySql
- oracle查詢語句查詢增加一列內容Oracle
- oracle 使用explain plan分析查詢語句OracleAI
- 有關Oracle分頁查詢語句Oracle
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- oracle處理SQL的過程OracleSQL
- PostgreSQL 原始碼解讀(33)- 查詢語句#18(查詢優化-表示式預處理#3)SQL原始碼優化
- PostgreSQL 原始碼解讀(34)- 查詢語句#19(查詢優化-表示式預處理#4)SQL原始碼優化
- PostgreSQL 原始碼解讀(31)- 查詢語句#16(查詢優化-表示式預處理#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(32)- 查詢語句#17(查詢優化-表示式預處理#2)SQL原始碼優化
- Hql查詢語句
- mysql查詢語句MySql