ORACLE 查詢語句處理過程(

murkey發表於2013-12-18



語句執行過程:

首先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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章