同事寫的,我整理了一下
1)通過分析sql執行計畫來優化sql,這是最直接、最有效的方式。
2)oracle sql優化的目標主要有如下三點:降低執行sql語句所需要的工作負載;均衡執行sql語句所需要的工作負載;並行化執行sql語句所需要的工作負載。
3)sql的優化原則不能一概而論,與很多因素有關。比如你的系統的種類,是oltp還是olap?系統資料量的大小;資料的分布;表和索引是否分析;表的一些存在嚴重傾斜的列上是否存在直方圖;你用hint了嗎?
optimizer_mode的值(oracle 10g中的選項有first_rows/all_rows/first_rows_n,9i中還有rule/choose)是什麼;
db_file_multiblock_read_count的值(影響oracle在執行全表掃瞄時一次讀取的block數量, 10gr2後資料庫會根據系統的情況自動調整)是多少;_optim_peek_user_binds的值(當資料傾斜時是否對執行計畫糾偏,可選值為true/false,預設為true)是什麼;
optimizer_index_cost_adj 的值(索引掃瞄與全表掃瞄的成本比較,值範圍為1~10000,百分比,預設為100,表示兩者等價)是多少等等。
總之,調優非常靈活,沒有固定的模式,應該具體問題具體分析。
4)索引不一定比全表掃瞄快。
5)不要在where中使用function,如果要用,可以考慮建函式索引。
6)建聯合索引時把離散程度最高的列放在最前面,這適用於主鍵索引或者需要高選擇性的index range scan的索引。
7)不要讓sql執行時產生隱式轉換。
8)如果有可能,就用union all 代替or吧。
通常情況下, 用union替換where子句中的or將會起到較好的效果. 對索引列使用or將造成全表掃瞄. 注意, 以上規則只針對多個索引列有效. 如果有column沒有被索引, 查詢效率可能會因為你沒有選擇or而降低. 在下面的例子中, loc_id 和region上都建有索引.
高效:select loc_id , loc_desc , region
from location
where loc_id = 10
union
select loc_id , loc_desc , region
from location
where region = 「melbourne」
低效:select loc_id , loc_desc , region
from location
where loc_id = 10 or region = 「melbourne」
9)用exists不一定比用in好!如果子查詢中的select有很好的選擇性,那就用in吧!即in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。這裡要注意not in中的null問題。
10)使用count(*)而不是count(columnname),count(columnname)當碰到所查的列的值有null的時候,結果就不准了。
11)null值不入普通的b樹索引,所以對b樹索引而言,純粹的null/not null條件是不會使用該索引的。
12)不要在重複值過多(即離散程度很小)的列上建索引
13)在基數小的字段上要善於使用位圖索引。位圖索引會記錄相關的null值列資訊。
14)cbo並不總是正確的!當你發現cbo產生的執行計畫有問題時,先仔細分析一下為什麼會這樣:表和索引分析了嗎?資料是否傾斜?或者你可以做乙個10053或者10046的trace,分析一下原因。
15)不要對長度太長的varchar2欄位建索引。如果確實有這樣的需求,可以考慮使用oracle text。
16)nested loops(nl)連線時要選擇正確的連線順序,選取的原則通常是盡量選擇返回較少資料的表作為驅動表。
17)對於nested loops(nl)而言,如果driving row source(外部表)比較小,並且在inner row source(內部表)上有唯一索引,或有高選擇性非唯一索引時,使用這種方法可以得到很好的效率;nl有其它連線方法沒有的乙個優點:nl可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料,這可以實現快速響應。
18)sort merge join(smj)對於非等值連線,這種連線方式的效率是比較高的;如果在關聯的列上都有索引且兩個row source差不多大,可以考慮使用smj;smj通常並不適合於oltp系統,本質原因是因為對於oltp系統而言,排序是非常昂貴的操作。除非你能避免排序操作,比如關聯的列上都有索引。
19)hash join(hj)適合於小表與大表連線並且返回大型結果集的連線,其效率好於smj與nl,但是這種連線只能用於等值連線且必須用cbo。若要讓hj取得較好的效率,如下幾點要注意:確認小表是驅動表;確認涉及到的表和連線鍵都分析過了;如果在連線鍵上資料不均勻的話,一定要收集直方圖;如果可以,調大pga_aggregate_target的值。
如何看執行計畫
1)從縮進度最大的行讀取,它是最先被執行的步驟
2)當縮排一樣時,最上面的最先被執行
其他資料:
優化器模式
表掃瞄方式
oracle 連線和半連線
mysql 常用sql語句優化原則
優化索引mysql 中用到索引的的場景 索引的使用原則 符合左字首原則 索引上不要使用函式和進行運算,另外型別也要對應 比如 where name abc 雖然sql不會報錯,但是會導致索引失效 使用 or 時,如果存在沒有在索引上的列,也會導致索引失效 如果 mysql 分析使用索引必沒有使用索引...
SQL語句優化的原則
sql語句優化的原則 1 使用索引來更快地遍歷表。預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引 下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在 對各種查詢的分析和 上。一般來說 有大量重複值 且經常有範圍查詢 between 和order by group by發...
SQL優化原則 編輯
一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化。...