Oracle SQL優化 原理篇

2021-10-10 12:08:25 字數 1568 閱讀 7648

2. 成本

二. 執行計畫

內容會持續更新!!

優化器是資料庫核心功能,也是最為複雜的一塊。負責將使用者提交的sql語句根據各種判斷標準,制定出最優的執行計畫,並交給執行器來執行。

成本是優化器(基於成本的優化器)中反映sql執行代價的乙個指標。

基於規則的優化器(rule based optimizer,rbd)。內部採用規則列表,等級越高的規則越會被優先採用。

基於成本的優化器(cost based optimizer,cbd)。成本越低,sql執行的代價越小, 則是乙個更優的執行路徑。cbd基本上是首選。

成本是優化器(基於成本的優化器)中反映sql執行代價的乙個指標。

是指花費在單資料塊讀取上的時間,加上花費在多資料塊上的時間,再加上所需的cpu處理時間,然後將總和除以單資料塊讀取所花費的時間。

在執行計畫中,可以看到成本(cost)那一列的值。

oracle用來執行目標sql語句的這些步驟的組合就被稱為執行計畫

執行計畫的步驟id前面帶有*號,說明這個操作有相關的謂詞條件(訪問條件或過濾條件)

資料庫生成執行計畫,是乙個開銷很大的工作。因此,一般資料庫都會採取快取策略。將生成好的執行計畫儲存起來,為了下次可以重用它,避免了再次生成產生開銷。在oracle資料庫中有一塊記憶體區域稱為庫快取記憶體(library cache,它是共享池的一部分)。使用者執行的sql語句或者pl/sql塊,其執行計畫會被快取在這個區域中。它的作用就是當相同的sql語句或者pl/sql塊再次執行時,就可以直接利用快取在該區域中的執行計畫,而不用再進行昂貴的解析操作。

在oracle資料庫中,每條sql語句都有乙個稱為sql_id的唯一標識。在對一條sql語句的解析中,oracle會查詢在庫快取記憶體中是否存在sql_id。如果不存在,則會申請一塊記憶體區域用來儲存解析後的結果。在邏輯上,這塊記憶體區域儲存的資料結構稱為游標。在記憶體區域中,一部分是與sql語句相關的,被稱為父游標;另一部分是與語句的執行計畫相關的,被稱為子游標。從名字就可以看出,兩者是有主從關係的。對於同一條sql語句,可能會存在多個子游標,我們稱之為不同版本的子游標。不同的子游標會有其執行計畫可能相同,也可能不同;但它們都屬於同乙個父游標。每個子游標都會被賦予乙個序列號,即child_number。一條語句生成的第乙個游標的child_number為0,相應的oracle會為每個執行計畫生成乙個雜湊值以作區分。

可以通過下面的物件來檢視:

v$sqlarea

v$sql

在執行計畫中的operation列,對應的就是訪問路徑,即這個步驟是如何訪問資料的。常見的有如下的一些分類:

索引相關的訪問路徑:這部分又可分為b樹索引訪問路徑和點陣圖索引訪問路徑。b樹索引訪問路徑主要包括索引唯一掃瞄、索引範圍掃瞄、索引全掃瞄、索引快速全掃瞄、索引跳躍掃瞄等方式。位圖索引訪問路徑包括位圖索引單鍵掃瞄、範圍掃瞄、全掃瞄、快速全掃瞄及按位與、或、減等方式掃瞄。

其他的訪問路徑:這部分包括檢視、集合、層次查詢等訪問方式。

倒車雷達原理篇

往後倒一點,再往後,打方向盤,打多了,回一點再倒,好,停!相信一般的車主在停車場泊位時,都會遇到車輛保管員的 熱情招呼 車技純熟的倒 也與人工提示配合默契 車技一般 方向感較差的,就經常使負責指揮的那位人士高度緊張,脾氣急躁的還少不了擠兌車主幾句。可是,並不是所有車主都有幸得到 人工倒車指引,比如說...

iOS知識原理篇

weak策略表明該屬性定義了一種 非擁有關係 nonowning relationship 為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似 然而在屬性所指的物件遭到摧毀時,屬性值也會清空 nil out runtime對註冊的類,會進行布局,會將 weak 物件放...

MongoDB分片原理篇

mongodb目前3大核心優勢 靈活模式 高可用性 可擴充套件性 通過json文件來實現靈活模式,通過複製集來保證高可用,通過sharded cluster來保證可擴充套件性。何時使用分片技術 儲存容量需求超出單機磁碟容量 活躍的資料集超出單機記憶體容量,導致很多請求都要從磁碟讀取資料,影響效能 寫...