SQL調優之八 關於SQL調優

2022-09-06 22:45:25 字數 4900 閱讀 3676

sql調優是指對未達到預期的sql語句進行診斷和修復

sql調優是乙個反覆的過程,是一步一步的將sql語句的效能提公升到預期的目標。

它是對乙個已經實施完成了的應用的問題的解決,相反的,應用設計則是在實施之前,就應該已經設定好了安全和效能的目標。

一次典型的調優過程,需要達到以下的其中乙個目的:

相對的,吞吐問題,則想象在乙個資料倉儲中,一條並行執行三分鐘的語句消耗了整個db伺服器的cpu資源,導致其它查詢無法執行。

這兩者之間的三分鐘是不一樣的。

sql調優分為主動還有被動,主動的情況下,你可以使用sql tuning advisor來判斷你是否可以讓sql執行得更好,當然,也可以用其他方式主動獲取一些可能有效能問題的語句。

被動方式,一般是開發人員主動跟你說某某sql有問題,或者是資料庫受了影響的情況下你去解決問題。

無論哪種方式,一般來說,sql調優包含以下的任務:

1,識別高負載的sql

檢視執行歷史來找到哪些sql導致了資料庫的效能以及資源問題

2,收集效能相關的資料

優化器統計資訊對於sql調優來說尤為重要,如果統計資訊不存在或者不準確的話,優化器就可能無法生成最優的執行計畫。

3,判斷導致效能問題的原因

a)效率低下的sql語句寫法

如果一條sql本身寫的很差,導致它要做很多不必要的工作的話,那麼優化器也沒辦法提公升這條語句的效能。比如說:

b)次優的執行計畫

在某些時候,優化器會選擇次優的資料讀取方式,比如說當謂詞的列的選擇性低的時候,執行計畫可能選擇使用全表掃瞄來獲取資料而不是索引,這個時候,如果過濾的數值占多數的話,全表可能沒錯,但假如過濾的數值只有乙個,那用全表的效能就要差很多。並且還會影響到後續選什麼連線方式。

你可以將不怎麼樣的執行計畫和好的執行計畫進行對比,然後再聯絡最近發生的變動,比如說資料量。以此來判斷效能下降的原因。

c)資料獲取結構的缺失

比如說索引或者物化檢視

d)不新鮮的優化器資訊

當表上的統計資訊不是最新的時候,比如說dml操作之後,執行計畫就可能基於這些資訊做出錯誤的判斷。

e)硬體問題

cpu, 記憶體,i/o問題

4,定義問題的範圍

解決問題的方法的生效範圍和問題本身的級別是相匹配的。比如說db級別的問題跟sql語句級別的問題。

舉個例子,shared pool太小,游標老化太快,導致大量的硬解析。解決方法就是在資料庫級別修改初始化引數來增大share pool,這種解決方案是對所有會話生效的。

相對的,如果一條sql沒有使用對效能有幫助的索引,結果你在資料庫級別應用了某種解決方案,那麼它可能會導致其他會話的效能問題。

5,在問題sql上應用正確的操作

不同情況的sql應該應用不同的操作。比如說:

6,避免sql效能回退

為了確保一條sql語句一直使用效能良好的執行計畫,並且會去使用更好的執行計畫,你可以使用優化器統計資訊(繫結,收集之類的),sql profiles以及sql plan baselines。 

sql調優工具可以分為自動和手動的,自動的可以幫你提供一些診斷資訊,以及建議或者正確的操作。手動的則需要自己實施所有的步驟。

所有的調優工具都是基於資料庫的動態效能檢視,以及資料庫收集的統計資訊,度量值。

自動調優工具

資料庫提供了用於sql調優的幾個建議器。另外,spm(sql plan management)則是可以用來避免效能回退的乙個機制,同時也可以用來提高效能。

所有的自動調優工具可以使用都可以使用sql tuning sets作為輸入,sts是包含了執行統計資訊以及執行文字的sql集合。

1,automatic database diagnostic monitor (addm)

addm是資料庫的乙個內建的自我診斷工具。它可以自動定位乙個效能問題的原因,提供解決問題的建議,以及預期的益處。addm也會識別那些不需要採取操作的區域。

addm和其他建議器一樣,使用awr裡面的資訊來定位可能的效能問題,包括高負載的sql。

addm的報告可能會顯示什麼導致了效能問題,並且可能會給出建議的解決方案。比如說它可能會報告一條select語句消耗了大量的cpu,然後建議你跑sql tuning advisor去獲取優化建議。

2,sql tuning advisor

sta可以用來識別問題語句,並且建議怎麼去提公升該類語句的效能。當執行在資料庫維護視窗期間的時候,它也就是我們常說的automatic sql tuning advisor。

sta獲取一條或者多條sql作為輸入,然後使用automatic tuning optimizer來對sql進行優化。

建議器會做以下幾個步驟:

sql profiles是一條sql語句的輔助資訊。乙個sql profiles包含了在自動sql調優期間發現的,能夠對優化器進行更正的資訊。這些資訊可以提公升優化器對基數(cardinality)的預估準確度,以此來更準確地生成良好的執行計畫。

sta的輸出裡會給出一些合理的建議以及預期的優化結果。這些建議可能是對一些物件的統計資訊進行收集,建立索引,重構sql語句或者建立sql profile。

3,sql access advisor

sql access advisor是乙個內部診斷工具,用來生成一些關於物化檢視,索引,以及物化檢視日誌的建議,包括create, drop 和retain。

sql access advisor可以使用實際的負載作為輸入,也可以從schema那裡匯入假定的負載。

sql access adviosr會在空間使用量以及查詢效能之間做取捨,對新的或者原本就存在的物化檢視以及索引,給出成本價效比最高的配置建議。它也會對分割槽做出響應的建議。

4,sql plan management

spm是乙個預防性的機制。它可以讓優化器自動管理執行計畫,確保資料庫只使用已知的或者已經驗證過的執行計畫。

這個機制可以建立乙個sql plan baseline,baseline包含了乙個或者多個已經被接受了的sql執行計畫。通過使用baseline,spm可以預防執行計畫因為環境的變化而導致的效能回退,同時,它也允許優化器發現和使用更好的執行計畫。

5,sql performance analyzer

sql performance analyzer可以判斷乙個變更對sql工作負載的影響。系統的變更,比如說資料庫公升級或者增加新的索引都可能導致執行計畫的變化。通過使用sql performance analyzer, 你可以準確地**到系統變更對sql效能的影響。使用這些資訊你可以在sql效能退化的時候對資料庫進行調優,或者當sql效能提公升的時候識別和管理增益。

在某些情況下,你可能需要一些手動的工具來獲取你想要的資訊,比如說沒有自動調優工具的許可權。

執行計畫

可以通過以下方式獲取執行計畫:

這個方式可以讓你檢視優化器預估要採用的執行計畫,並沒有實際執行該語句

這個方式除了能夠提供執行計畫的資訊外,還能夠提供執行的統計資訊,比如說磁碟讀以及記憶體讀。

執行過的sql的執行計畫仍然會存在於share pool裡面。

你可以使用dbms_xplan包來獲取explain plan以及v4$sql_plan方式獲取的執行計畫。

實時的sql監控以及實時的資料庫操作

資料庫的實時的sql監控功能可以讓你在sql執行的時候監控它們的效能。

預設的,當一條語句並行執行,或者在單次執行裡面消耗了最少5秒的cpu或者i/o時間的時候,real-time sql monitoring就會自動啟用。

乙個資料庫操作指的是使用者或者應用自己定義的資料庫任務的集合,比如說,一次batch job或etl過程。你可以定義,監控以及匯報資料庫操作。

實時的資料庫操作提供了對復合操作的自動監控。資料庫在執行剛開始的時候就自動監控並行查詢,dml和ddl語句。

oracle enterprise manager cloud control (cloud control)也提供了方便使用的sql監控頁面。

另一方面,你也可以使用v$sql_monitor and v$sql_plan_monitor來監控sql的相關資訊。

你可以結合以下檢視來獲取sql執行的更多資訊。

v$active_session_history

v$session

v$session_longops

v$sql

v$sql_plan

乙個sql的跟蹤檔案可以提供單個sql的效能資訊:解析次數,物理和邏輯讀,library cache的未命中數等等。

可以通過使用dbms_monitor和dbms_session包來對指定的會話進行跟蹤。

對trace file的分析可以使用以下兩個格式化工具:

tkprof,可以把跟蹤檔案變成可讀的格式化檔案

trcsess,可以基於session id, client id和service id把多個跟蹤檔案整合成乙個。然後再通過tkprof對輸出的檔案進行格式化。

端對端的應用跟蹤簡化了對效能問題的診斷。因為正常情況下,單個客戶端可能會發起多個會話執行多條sql,這種情況下對session的跟蹤就顯得有點力不足了。

使用client id來追蹤應用運**況就可以貫穿資料庫的所有層面。

優化器hints

hint是在sql語句裡面加一些注釋來指引優化器做什麼操作。在測試或者開發環境,加hint可以用來測試某個獲取資料的方式的效能。

比如說強制使用索引,來測試使用索引的效能:

select /*+ index (employees emp_department_ix) */

employee_id, department_id

from employees

where department_id > 50;

以前的oem工具顯得臃腫,並且不是很好用。

但是最新的oem cloud control,流暢度好了很多,並且整合了很多任務具,可以試著用用看。

題外話:雖然說以前的觀點是有些dba只會複製貼上命令,脫離指令碼就不知道該做什麼了。但是,現在的資料庫產品越來越多,在原理差異性不是很大的情況下,善用工具其實是很好的。

sql調優技巧

1 避免無計畫的全表掃瞄 如下情況進行全表掃瞄 該錶無索引 對返回的行無人和限制條件 無where子句 對於索引主列 索引的第一列 無限制條件 對索引主列的條件含在表示式中 對索引主列的限制條件是is not null或 對索引主列的限制條件是like操作且值是乙個bind variable或 打頭...

SQL調優命令

命令工具 oracle sql plus 或者cmd sqlplus mmsuser agooy8tt xian 133 64 46 26 是 set autotrace off 不產生autotrace報告,預設設定,查詢按常規執行。set autotrace on statistics 查詢按常...

sql效能調優

基本原則 1.避免全表搜尋 2.建立索引 3.盡量避免向客戶端返回大量資料,若資料量大,考慮要求是否合理 4.盡量避免大事務操作,提高系統併發能力 5.盡量避免使用游標,因為效率差 關於where條件 1.盡量避免在where條件使用!或 操作符,否則引擎將放棄使用索引而全表搜尋 2.盡量避免在wh...