常用的SQL優化原則

2021-09-01 16:41:03 字數 2548 閱讀 1752

同事寫的,我整理了一下

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語句的優化。...