【SQL】Oracle SQL共享池檢查
在解析過程中,資料庫執行共享池檢查以確定它是否可以跳過語句處理的資源密集型步驟。
為此,資料庫使用雜湊演算法為每個 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 共享池檢查
如果檢查確定共享池中的語句具有相同的雜湊值,則資料庫執行語義和環境檢查以確定語句是否具有相同的含義。 相同的語法是不夠的。 例如,假設兩個不同的使用者登入到資料庫併發出以下 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- SQL查詢語句 (Oracle)SQLOracle
- 【MYSQL】Mysql常用檢查sqlMySql
- Oracle檢視歷史TOP SQLOracleSQL
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- [20220120]探究v$session.SQL_EXEC_ID在共享池.txtSessionSQL
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- ORACLE_OCP之SQL_子查詢OracleSQL
- MSSQL資料庫健康檢查--SQL Server巡檢SQL資料庫Server
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- [20230226]探究v$session.SQL_EXEC_ID在共享池(windows).txtSessionSQLWindows
- 【SQL】Oracle SQL處理的流程SQLOracle
- Oracle 11 sql tuning advisor sql access advisor關閉以及job檢視與停止OracleSQL
- Oracle PL/SQLOracleSQL
- 【SQL】17 SQL 檢視(Views)、SQL Date 函式、SQL NULL 值、SQLView函式Null
- 【VIEW】Oracle如何查詢固定檢視的定義或底層sql語句ViewOracleSQL
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- Oracle常用抓取SQL-標量子查詢等OracleSQL
- [20230227]探究v$session.SQL_EXEC_ID在共享池(補充).txtSessionSQL
- Oracle SQL精妙SQL語句講解OracleSQL
- Oracle SQL優化之sql tuning advisorOracleSQL優化
- 【SQL】Oracle 19c SQL隔離詳解(SQL Quarantine)SQLOracle
- launchbadge/sqlx: Rust SQL工具包讓SQL在編譯時驗證檢查SQLRust編譯
- 【SQL_PLAN】Oracle 透過檢視sql_plan 格式化執行計劃SQLOracle
- 查詢oracle正在執行的SQL和事務OracleSQL
- HighgoDB查詢慢SQL和阻塞SQLGoSQL
- Oracle 10046 SQL TRACEOracleSQL
- Oracle SQL處理OracleSQL
- Hacking Oracle with Sql InjectionOracleSQL
- Oracle SQL Model ClauseOracleSQL
- [ORACLE] SQL執行OracleSQL
- [Oracle]Oracle良性SQL建議OracleSQL
- oracle固定物件到共享池Oracle物件
- Oracle SQL調優系列之SQL Monitor ReportOracleSQL
- 如何使用SQL查詢檢視,Postico使用技巧分享~SQL