【SQL】Oracle SQL共享池檢查

xysoul_雲龍發表於2021-09-07

在解析過程中,資料庫執行共享池檢查以確定它是否可以跳過語句處理的資源密集型步驟。

為此,資料庫使用雜湊演算法為每個 SQL 語句生成一個雜湊值。 宣告雜湊值是 所示 V$SQL.SQL_ID 該雜湊值在 Oracle 資料庫版本中是確定性的,因此單個例項或不同例項中的相同語句具有相同的 SQL ID。

當使用者提交一條 SQL 語句時,資料庫會在 查詢 現有的已解析語句是否具有相同的雜湊值。 SQL 語句的雜湊值不同於以下值:

  • 語句的記憶體地址

    Oracle 資料庫使用 SQL ID 在查詢表中執行鍵控讀取。 這樣,資料庫就獲得了該語句可能的記憶體地址。

  • 語句  雜湊值

    一個 SQL 語句在共享池中可以有多個計劃。 通常,每個計劃都有不同的雜湊值。 如果同一個 SQL ID 有多個計劃雜湊值,則資料庫知道此 SQL ID 存在多個計劃。

根據提交的語句型別和雜湊檢查的結果,解析操作分為以下幾類:

  • 硬解析

    如果Oracle資料庫無法重用現有程式碼,則必須構建應用程式程式碼的新可執行版本。此操作稱為硬解析或庫快取未命中。

    注:

    資料庫始終執行 DDL 的硬解析。

    在硬解析過程中,資料庫會多次訪問庫快取和資料字典快取來檢查資料字典。 當資料庫訪問這些區域時,它 在所需物件上 使用稱為 的序列化裝置, 以便它們的定義不會改變。 閂鎖爭用會增加語句執行時間並降低併發性。

  • 軟解析

    軟解析是任何不是硬解析的解析。如果提交的語句與共享池中的可重用SQL語句相同,則Oracle資料庫將重用現有程式碼。這種程式碼重用也稱為庫快取命中。

    軟解析在執行多少工作方面可能會有所不同。 例如,配置會話共享 SQL 區域有時可以減少軟解析中的閂鎖數量,使它們“更軟”。

    一般來說,軟解析比硬解析更可取,因為資料庫會跳過最佳化和行源生成步驟,直接執行。

下圖是 UPDATE 專用伺服器架構中語句 的共享池檢查的簡化表示

圖 3-2 共享池檢查

圖 3-2 說明如下

如果檢查確定共享池中的語句具有相同的雜湊值,則資料庫執行語義和環境檢查以確定語句是否具有相同的含義。 相同的語法是不夠的。 例如,假設兩個不同的使用者登入到資料庫併發出以下 SQL 語句:

CREATE TABLE my_table ( some_col INTEGER );
SELECT * FROM my_table;

SELECT 兩個使用者 語句在語法上是相同的,但兩個獨立的模式物件被命名為 my_table 這種語義差異意味著第二個語句不能重用第一個語句的程式碼(它會有兩個子游標)。

即使兩個語句在語義上相同,環境差異也會強制進行硬解析。 在這種情況下, 是可以影響執行計劃生成的會話設定的總和,例如工作區大小或最佳化器設定(例如,最佳化器模式)。 考慮以下由單個使用者執行的一系列 SQL 語句:

ALTER SESSION SET OPTIMIZER_MODE=ALL_ROWS;
ALTER SYSTEM FLUSH SHARED_POOL;               # optimizer environment 1SELECT * FROM sh.sales;ALTER SESSION SET OPTIMIZER_MODE=FIRST_ROWS;  # optimizer environment 2SELECT * FROM sh.sales;ALTER SESSION SET SQL_TRACE=true;             # optimizer environment 3SELECT * FROM sh.sales;

在前面的示例中,相同的 SELECT 語句在三個不同的最佳化器環境中執行。 因此,資料庫為這些語句建立了三個單獨的共享 SQL 區域,並強制對每個語句進行硬解析。

也可以看看:

  • 瞭解私有 SQL 區域和共享 SQL 區域的 

  • 瞭解如何配置共享池

  • 瞭解閂鎖的 

機翻,可檢視原文,官方文件 sql-tuning-guide 第三章  ,也可參考本博其他文章:

http://blog.itpub.net/29487349/viewspace-2785648/


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

相關文章