【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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 檢查命中率的SQLOracleSQL
- Oracle資料庫健康檢查常用SQLOracle資料庫SQL
- oracle 查權sqlOracleSQL
- 【MYSQL】Mysql常用檢查sqlMySql
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- 如何建立SQL 調優集(—) 從共享池載入SQL
- Oracle檢視TOP SQLOracleSQL
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- oracle concept-pga和共享sql 私有sql記載OracleSQL
- 查詢oracle效能SQLOracleSQL
- oracle常用SQL查詢OracleSQL
- Oracle 共享池操作Oracle
- SQL SERVER與ORACLE的資料共享SQLServerOracle
- oracle、my sql、sql隨機查詢語句OracleSQL隨機
- SQL查詢語句 (Oracle)SQLOracle
- Oracle 常用SQL查詢列表OracleSQL
- 常用ORACLE查詢命令SQLOracleSQL
- Oracle遞迴查詢sqlOracle遞迴SQL
- oracle sql tuning 3--常用檢查問題語句OracleSQL
- database/sql的連線池是整個工程共享的麼?DatabaseSQL
- 如何定位SQL語句在共享池裡用到了哪些chunksSQL
- 將指定SQL的執行計劃從共享池刪除SQL
- sql查詢檢視列備註SQL
- SQL Server之查詢檢索操作SQLServer
- 檢視v$sql_shared_cursor檢視獲取sql語句為什麼不能共享?SQL
- Oracle檢視歷史TOP SQLOracleSQL
- ORACLE一些巡檢sqlOracleSQL
- 共享SQL語句SQL
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- MSSQL資料庫健康檢查--SQL Server巡檢SQL資料庫Server
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- Oracle 外來鍵查詢sqlOracleSQL
- oracle sql分頁查詢(一)OracleSQL
- oracle常用經典sql查詢OracleSQL
- Oracle SQL的遞迴查詢OracleSQL遞迴
- 檢查sql or session 執行的進度SQLSession
- SQL語句執行進度檢查SQL
- 常用的檢查SQL Agent Job 語句SQL