通過分析SQL語句的執行計畫優化SQL 三

2021-04-17 06:02:34 字數 1448 閱讀 5245

四:oracle的優化器

優化器有時也被稱為查詢優化器,這是因為查詢是影響資料庫效能最主要的部分,不要以為只有select語句是查詢。實際上,帶有任何where條件的dml(insert、update、delete)語句中都包含查詢要求,在後面的文章中,當說到查詢時,不一定只是指select語句,也有可能指dml語句中的查詢部分。優化器是所有關聯式資料庫引擎中的最神秘、最富挑戰性的部件之一,從效能的角度看也是最重要的部分,它效能的高低直接關係到資料庫效能的好壞。

我們知道,

sql語句同其它語言(如c語言)的語句不一樣,它是非過程化(non-procedural)的語句,即當你要取資料時,不需要告訴資料庫通過何種途徑去取資料,如到底是通過索引取資料,還是應該將表中的每行資料都取出來,然後再通過一一比較的方式取資料(即全表掃瞄),這是由資料庫的優化器決定的,這就是非過程化的含義,也就是說,如何取資料是由優化器決定,而不是應用開發者通過程式設計決定。在處理

sql的select、update、insert或delete語句時,oracle 必須訪問語句所涉及的資料,oracle的優化器部分用來決定訪問資料的有效路徑,使得語句執行所需的i/o和處理時間最小。

為了實現乙個查詢,核心必須為每個查詢定製乙個查詢策略,或為取出符合條件的資料生成乙個執行計畫(execution plan)。典型的,對於同乙個查詢,可能有幾個執行計畫都符合要求,都能得到符合條件的資料。例如,參與連線的表可以有多種不同的連線方法,這取決於連線條件和優化器採用的連線方法。為了在多個執行計畫中選擇最優的執行計畫,優化器必須使用一些實際的指標來衡量每個執行計畫使用的資源(i/0次數、cpu等),這些資源也就是我們所說的代價(cost)。如果乙個執行計畫使用的資源多,我們就說使用執行計畫的代價大。以執行計畫的代價大小作為衡量標準,優化器選擇代價最小的執行計畫作為真正執行該查詢的執行計畫,並拋棄其它的執行計畫。

在oracle的發展過程中,一共開發過2種型別的優化器:基於規則的優化器和基於代價的優化器。這2種優化器的不同之處關鍵在於:取得代價的方法與衡量代價的大小不同。現對每種優化器做一下簡單的介紹:

基於規則的優化器 -- rule based (heuristic) optimization(簡稱rbo):如,對於

select * from emp where deptno = 10;

這個查詢來說,如果是使用基於規則的優化器,而且deptno列上有有效的索引,則會通過deptno列上的索引來訪問emp表。在絕大多數情況下,這是比較高效的,但是在一些特殊情況下,使用索引訪問也有比較低效的時候,現舉例說明:

1:emp表比較小,該錶的資料只存放在幾個資料塊中。此時使用全表掃瞄比使用索引訪問emp表反而要好。因為表比較小,極有可能資料全在記憶體中,所以此時做全表掃瞄是最快的。而如果使用索引掃瞄,需要先從索引中找到符合條件記錄的rowid,然後再一一根據這些rowid從emp中將資料取出來,在這種條件下,效率就會比全表掃瞄的效率要差一些。

[3]

通過分析SQL語句的執行計畫優化SQL (二)

第1章 效能調整綜述 oracle資料庫是高度可調的資料庫產品。本章描述調整的過程和那些人員應與oracle伺服器的調整有關,以及與調整相關聯的作業系統硬體和軟體。本章包括以下方面 l 誰來調整系統?l 什麼時候調整?l 建立有效調整的目標 l 在設計和開發時的調整 l 調整產品系統 l 監控產品系...

通過分析SQL語句的執行計畫優化SQL 四

五 oracle的執行計畫 背景知識 為了更好的進行下面的內容我們必須了解一些概念性的術語 共享sql語句 為了不重複解析相同的sql語句 因為解析操作比較費資源,會導致效能下降 在第一次解析之後,oracle將sql語句及解析後得到的執行計畫存放在記憶體中。這塊位於系統全域性區域sga syste...

通過分析SQL語句的執行計畫優化SQL 五

rowid的概念 rowid是乙個偽列,既然是偽列,那麼這個列就不是使用者定義,而是系統自己給加上的。對每個表都有乙個rowid的偽列,但是表中並不物理儲存rowid列的值。不過你可以像使用其它列那樣使用它,但是不能刪除改列,也不能對該列的值進行修改 插入。一旦一行資料插入資料庫,則rowid在該行...