【SQL】Oracle SQL處理的流程

xysoul_雲龍發表於2021-09-07

本文主要介紹Oracle SQL處理的流程


1.概述

下圖描述了Oracle資料庫如何處理sql的一個流程,根據需求不同,可能會省略某個部分


1.1 SQL解析

      當應用程式發出SQL語句時,應用程式對資料庫進行解析呼叫,以準備執行該語句。parse呼叫開啟或建立一個遊標,該遊標是特定於會話的私有SQL區域的控制程式碼,該區域儲存已解析的SQL語句和其他處理資訊。遊標和專用SQL區域位於程式全域性區域(PGA)中。

     解析包括語法解析、語義檢查(含義)、共享池檢查(硬解析/軟解析之類)。 SQL共享池檢查,請參考其他文件。

1.2 SQL最佳化

    在最佳化期間,Oracle 資料庫必須對每個唯一的 DML 語句至少執行一次硬解析,並在此解析期間執行最佳化。

1.3 SQL行源生成

  行源生成器是從最佳化器接收最佳執行計劃並生成可供資料庫其餘部分使用的迭代執行計劃的軟體。

  迭代計劃是一個二進位制程式,當由SQL引擎執行時,生成結果集。該計劃採取了一系列步驟的組合形式。每一步都返回一個行集。下一步使用該集中的行,或者最後一步將這些行返回給發出SQL語句的應用程式。

  行源是執行計劃中的步驟返回的行集,以及可以迭代處理行的控制結構。行源可以是表、檢視或聯接或分組操作的結果。

  行源生成器生成一個行源樹,它是行源的集合。


行源樹顯示以下資訊:

•對該宣告引用的表格進行排序

•宣告中提到的每個表的訪問方法

•語句中受聯接操作影響的表的聯接方法

•資料操作,如篩選、排序或聚合

1.4 SQL執行

  在執行過程中,如果資料不在記憶體中,則資料庫將資料從磁碟讀取到記憶體中。資料庫還取出確保資料完整性所需的任何鎖和閂鎖,並記錄在 SQL 執行期間所做的任何更改。處理 SQL 語句的最後階段是關閉遊標。

2.Oracle如何處理DML

2.1獲取行集

    大多數 DML 語句都有一個查詢元件。在查詢中,遊標的執行將查詢結果放入一組稱為結果集的行中。


     在提取階段,資料庫選擇行,如果查詢請求,則對行進行排序。每次連續提取都會檢索另一行結果,直到提取到最後一行。


     通常,在獲取最後一行之前,資料庫無法確定某個查詢要檢索的行數。Oracle 資料庫檢索資料以響應 fetch 呼叫,因此資料庫讀取的行越多,它執行的工作就越多。對於某些查詢,資料庫儘可能快地返回第一行,而對於其他查詢,它在返回第一行之前建立整個結果集。

2.2 讀一致性

   一般情況下,查詢透過Oracle 資料庫讀取一致性機制來檢索資料,該機制保證查詢讀取的所有資料塊在單個時間點上是一致的。

    讀取一致性使用撤消資料來顯示資料的過去版本。例如,假設查詢必須在全表掃描中讀取 100 個資料塊。查詢處理前 10 個塊,而不同會話中的 DML 修改塊 75。當第一個會話到達塊 75 時,它實現更改並使用撤消資料檢索舊的、未修改的資料版本並構造塊的非當前版本75 在記憶體中。

2.3 資料更改

     必須更改資料的 DML 語句使用讀取一致性來僅檢索在修改開始時與搜尋條件匹配的資料。


      之後,這些語句檢索當前狀態中存在的資料塊並進行所需的修改。資料庫必須執行與資料修改相關的其他操作,例如生成重做和撤消資料。


3.Oracle如何處理DDL

Oracle 資料庫處理 DDL 的方式與 DML 不同。


例如,建立表時,資料庫不會最佳化CREATE TABLE語句。相反,Oracle 資料庫解析 DDL 語句並執行命令。


資料庫處理 DDL 的方式不同,因為它是在資料字典中定義物件的一種方式。通常,Oracle 資料庫必須解析和執行許多遞迴 SQL語句才能執行 DDL 語句

CREATE TABLE mytable (mycolumn INTEGER);

通常,資料庫會執行幾十個遞迴語句來執行上面的語句。遞迴 SQL 將執行如下操作:


  • COMMIT在執行CREATE TABLE語句 之前發出 a

  • 驗證使用者許可權是否足以建立表

  • 確定表應該駐留在哪個表空間

  • 確保沒有超過表空間配額

  • 確保架構中沒有物件具有相同的名稱

  • 將定義表的行插入到資料字典中

  • 如果DDL語句成功,則發出COMMIT;如果未成功,則發出ROLLBACK


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

相關文章