sql優化基本概念

2021-05-25 03:26:23 字數 4208 閱讀 6313

我們知道,sql語句同其它語言(如c語言)的語句不一樣,它是非過程化(non-procedural)的語句,即當你要取資料時,不需要告訴資料庫通過何種途徑去取資料,如到底是通過索引取資料,還是應該將表中的每行資料都取出來,然後再通過一一比較的方式取資料(即全表掃瞄),這是由資料庫的優化器決定的,這就是非過程化的含義,也就是說,如何取資料是由優化器決定,而不是應用開發者通過程式設計決定。在處理sql的select、update、insert或delete語句時,oracle 必須訪問語句所涉及的資料,oracle的優化器部分用來決定訪問資料的有效路徑,使得語句執行所需的i/o和處理時間最小。

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

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

基於代價的優化器 -- cost based optimization(簡稱cbo)

oracle把乙個代價引擎(cost engine)整合到資料庫核心中,用來估計每個執行計畫需要的代價,該代價將每個執行計畫所耗費的資源進行量化,從而cbo可以根據這個代價選擇出最優的執行計畫。乙個查詢耗費的資源可以被分成3個基本組成部分:i/o代價、cpu代價、network代價。i/o代價是將資料從磁碟讀入記憶體所需的代價。訪問資料報括將資料檔案中資料塊的內容讀入到sga的資料快取記憶體中,在一般情況下,該代價是處理乙個查詢所需要的最主要代價,所以我們在優化時,乙個基本原則就是降低查詢所產生的i/o總次數。cpu代價是處理在記憶體中資料所需要的代價,如一旦資料被讀入記憶體,則我們在識別出我們需要的資料後,在這些資料上執行排序(sort)或連線(join)操作,這需要耗費cpu資源。

對於需要訪問跨節點(即通常說的伺服器)資料庫上資料的查詢來說,存在network代價,用來量化傳輸操作耗費的資源。查詢遠端表的查詢或執行分布式連線的查詢會在network代價方面花費比較大。

在使用cbo時,需要有表和索引的統計資料(分析資料)作為基礎資料,有了這些資料,cbo才能為各個執行計畫計算出相對準確的代價,從而使cbo選擇最佳的執行計畫。所以定期的對錶、索引進行分析是絕對必要的,這樣才能使統計資料反映資料庫中的真實情況。否則就會使cbo選擇較差的執行計畫,影響資料庫的效能。分析操作不必做的太頻繁,一般來說,每星期一次就足夠了。切記如果想使用cbo,則必須定期對錶和索引進行分析。

是否收集統計資訊進行評估

1、該錶的資料修改量(insert/update/delete)大於表的總行數的10%時建議收集 (必須條件)

2.表結構修改後,如果修改欄位不在條件語句或者索引列上,可以不收集統計資訊,否則應該收集(參考條件)

--收集語句

begin dbms_stats.gather_table_stats(ownname => 'cspidata',

tabname => 'icss_case_collect',

method_opt => 'for all columns size repeat',

degree => 1,

cascade => true,

no_invalidate => false);

end;

/對於分析用的命令,隨著資料庫版本的公升級,用的命令也發生了變換,在oracle 8i以前,主要是用analyze命令。在oracle 8i以後,又引入了dbms_stats儲存包來進行分析。幸運的是從oracle 10g以後,分析工作變成自動的了,這減輕的dba的負擔,不過在一些特殊情況下,還需要一些手工分析。使用區別見:analyze 和dbms_stats.gather_table_stats區別

如果採用了cbo優化器,而沒有對錶和索引進行分析,沒有統計資料,則oracle使用預設的統計資料(至少在oracle 9i中是這樣),這可以從oracle的文件上找到。使用的預設值肯定與系統的實際統計值不一致,這可能會導致優化器選擇錯誤的執行計畫,影響資料庫的效能。

要注意的是:雖然cbo的功能隨著oracle新版本的推出,功能越來越強,但它不是能包治百病的神藥,否則就不再需要dba了,那我就慘了!!!實際上任何乙個語句,隨著硬體環境與應用資料的不同,該語句的執行計畫可能需要隨之發生變化,這樣才能取得最好的效能。所以有時候不在具體的環境下而進行sql效能調整是徒勞的。

共享sql語句

為了不重複解析相同的sql語句(因為解析操作比較費資源,會導致效能下降),在第一次解析之後,oracle將sql語句及解析後得到的執行計畫存放在記憶體中。這塊位於系統全域性區域sga(system global area)的共享池(shared buffer pool)中的記憶體可以被所有的資料庫使用者共享。因此,當你執行乙個sql語句(有時被稱為乙個游標)時,如果該語句和之前的執行過的某一語句完全相同,並且之前執行的該語句與其執行計畫仍然在記憶體中存在,則oracle就不需要再進行分析,直接得到該語句的執行路徑。oracle的這個功能大大地提高了sql的執行效能並大大節省了記憶體的使用。使用這個功能的關鍵是將執行過的語句盡可能放到記憶體中,所以這要求有大的共享池(通過設定shared buffer pool引數值)和盡可能的使用繫結變數的方法執行sql語句

rowid的概念:

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

row source(行源)

用在查詢中,由上一操作返回的符合條件的行的集合,即可以是表的全部行資料的集合;也可以是表的部分行資料的集合;也可以為對上2個row source進行連線操作(如join連線)後得到的行資料集合

driving table(驅動表)

該錶又稱為外層表(outer table)。這個概念用於巢狀與hash連線中。如果該row source返回較多的行資料,則對所有的後續操作有負面影響。注意此處雖然翻譯為驅動表,但實際上翻譯為驅動行源(driving row source)更為確切。一般說來,是應用查詢的限制條件後,返回較少行源的表作為驅動表,所以如果乙個大表在where條件有有限制條件(如等值限制),則該大表作為驅動表也是合適的,所以並不是只有較小的表可以作為驅動表,正確說法應該為應用查詢的限制條件後,返回較少行源的表作為驅動表。在執行計畫中,應該為靠上的那個row source,後面會給出具體說明。在我們後面的描述中,一般將該錶稱為連線操作的row source 1。

probed table(被探查表)

該錶又稱為內層表(inner table)。在我們從驅動表中得到具體一行的資料後,在該表中尋找符合連線條件的行。所以該錶應當為大表(實際上應該為返回較大row source的表)且相應的列上應該有索引。在我們後面的描述中,一般將該錶稱為連線操作的row source 2。

組合索引(concatenated index)

由多個列構成的索引,如create index idx_emp on emp(col1, col2, col3, ……),則我

19們稱idx_emp索引為組合索引。在組合索引中有乙個重要的概念:引導列(leading column),在上面的例子中,col1列為引導列。當我們進行查詢時可以使用」where col1 = ? 」,也可以使用」where col1 = ? and col2 = ?」,這樣的限制條件都會使用索引,但是」where col2 = ? 」查詢就不會使用該索引。所以限制條件中包含先導列時,該限制條件才會使用該組合索引

可選擇性(selectivity):

比較一下列中唯一鍵的數量和表中的行數,就可以判斷該列的可選擇性。如果該列的」唯一鍵的數量/表中的行數」的比值越接近1,則該列的可選擇性越高,該列就越適合建立索引,同樣索引的可選擇性也越高。在可選擇性高的列上進行查詢時,返回的資料就較少,比較適合使用索引查詢。

SQL基本概念

結構化查詢語言 structured query language 簡稱sql,是一種特殊目的的程式語言,是一種資料庫查詢和程式語言,用於訪問資料以及查詢 更新和管理關係資料庫系統。show databases 檢視所有的資料庫 use 庫名 開啟指定 的庫 show tables 顯示庫中的所有表...

SQL語句基本概念

星期五 2014年11月21日 sql語句 sql語句用於檢索維護資料庫中的資料 create alter select update insert delete drop 使用sql的優點 sql是所有rdbms使用的公共語言 sql不遵循任何特定的執行模式,它一次可以訪問多個記錄 sql使用簡單...

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...