SQL 調優專題總結

2021-09-08 17:20:17 字數 4120 閱讀 3892

oracle 的優化器:

oracle 有兩種優化器:基於規則的優化器(rbo/rule based optimizer)和基於代價的優化器(cbo/cost based optimizer).

首先,我們要確定資料庫執行在何種優化模式下,相應的引數是:optimizer_mode, 11g 的優化器再確認

其次、檢查被索引的列或組合索引的首列是否出現在pl/sql 語句的where子句中,這是執行計畫能用到相關索引的必要條件.

第三、看採用了哪種型別的連線方式。oracle 的共有sort merge join(smj)、hash join(hj)和nested loop join(nl)。在兩張表連線,且內錶的目標列上建有索引時,只有nested loop 才有效地利用到該索引。smj 即使相關列上建有索引,最多只能因索引的存在,避免資料排序過程。hj 由於須做hash 運算,索引的存在對資料查詢速度幾乎沒有影響.

第四、看連線順序是否允許使用相關索引。假設表emp 的deptno 列上有索引,表dept 的列deptno 上無索引,where 語句有 emp.deptno=dept.deptno 條件。在做nl連線時,emp 做為外表,先被問,由於連線機制原因,外表的資料訪問方式是全表掃瞄,emp.deptno 上的索引顯然是用不上,最多在其上做索引全掃瞄或索引快速全掃瞄.

第五、是否用到系統資料字典表或檢視。由於系統資料字典表都未被分析過,可能導致極差的'執行計畫‛。但是不要擅自對資料字典表做分析,否則可能導致死鎖,或系統效能下降。

第六、索引列是否函式的引數。如是,索引在查詢時用不上。

第七、是否存在潛在的資料型別轉換。如將字元型資料與數值型資料比較,oracle 會自動將字元型用to_number()函式進行轉換,從而導致第六種現象的發生。

第八、是否為表和相關的索引蒐集足夠的統計資料。對資料經常有增、刪、改的表最好定期對錶和索引進行分析,可用sql 語句analyze table table_name compute statistics for all indexes;oracle 掌握了充分反映實際的統計資料,才有可能做出正確的選擇.

第十、索引列值是否可為空(null),如果索引列值可以是空值,在sql 語句中那些需要返回null 值的操作,將不會用到索引,如 count(*),而是用全表掃瞄。這是因為索引中儲存值不能為全空。

第十一、看是否有用到並行查詢(pqo)。並行查詢將不會用到索引。

第十二、看 pl/sql 語句中是否有用到bind 變數。由於資料庫不知道bind 變數具體是什麼值,在做非相等連線時,如‚<‚>‚like等。oracle 將引用預設值,在某些情況下會對執行計畫造成影響。如果從以上幾個方面都查不出原因的話,我們只好用採用在語句中加hint 的方式強制oracle 使用最優的'執行計畫‛。hint 採用注釋的方式,有行注釋和段注釋兩種方式。 如我們想要用到a 表的ind_col1 索引的話,可採用以下方式:select /*+ index(a ind_col1)*/ * from a where col1 = ***;注意,注釋符必須跟在select 之後,且注釋中的'+‛要緊跟著注釋起始符'/*‛或'--‛,否則hint 就被認為是一般注釋,對 pl/sql 語句的執行不產生任何影響。

一種是explain table 方式。使用者必須首先在自己的模式(schema)下,建立plan_table 表,執行計畫的每一步驟都將記錄在該表中,建表sql 指令碼為在$/rdbms/admin/ 下的utlxplan.sql。開啟sql*plus,輸入set autotrace on,然後執行待除錯的sql 語句。在給出查詢結果後,oracle 將顯示相應的'執行計畫‛,包括優化器型別、執行代價、連線方式、連線順序、資料搜尋路徑以及相應的連續讀、物理讀等資源代價。

如果我們不能確定需要跟蹤的具體sql 語句,比如某個應用使用一段時間後,響應速度忽然變慢。我們這時可以利用oracle 提供的另乙個有力工具tkprof,對應用的執行過程全程跟蹤.我們要先在系統檢視 v$session 中,可根據userid 或 machine,查出相應的sid 和serial#。以sys 或其他有執行dbms_system 程式包的使用者連線資料庫執行execute dbms_system.set_sql_trace_in_session(sid,serial#,true);。然後執行應用程式,這時在伺服器端,資料庫引數 user_dump_dest指示的目錄下,會生成ora__***x.trc 檔案,其中***x 為被跟蹤應用的作業系統程序號。應用程式執行完成後,用命令tkprof 對該檔案進行分析。

命令示例:"tkprof tracefile outputfile explain=userid/password"。在作業系統oracle 使用者下,鍵入tkprof,會有詳細的命令幫助。分析後的輸出檔案outputfile 中,有每一條pl/sql 語句的'執行計畫‛、cpu 占用、物理讀次數、邏輯讀次數、執行時長等重要資訊。根據輸出檔案的資訊,我們可以很快發現應用中哪條pl/sql 語句是問題的癥結所在。

在這些where 子句中,即使某些列存在索引,但是由於編寫了劣質的sql,系統在執行該sql 語句時也不能使用該索引,而同樣使用全表掃瞄,這就造成了響應速度的極大降低。

1)、is null 與 is not null

不能用null 作索引,任何包含null 值的列都將不會被包含在索引中。任何在where 子句中使用is null 或is not null 的語句優化器是不允許使用索引的。

2)、語句中的函式語句中如有函式操作如(upper,substr 等)時,優化器是不會使用索引的,應盡量少用或不用。

3)、帶萬用字元(%)的 like 語句如果萬用字元(%)在搜尋詞首出現,oracle 系統不會使用索引。在很多情況下可能無法避免這種情況,然而當萬用字元出現在字串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用:select * from user_m where loginid like 'r%';

4)、order by 語句order by 語句決定了oracle 如何將返回的查詢結果排序。order by 語句對要排序的列沒有什麼特別的限制。但任何在order by 語句的非索引項或者有計算表示式都將降低查詢速度,應盡量少用。

5)、not 在查詢時經常在where 子句使用一些邏輯表示式,如大於、小於、等於以及不等於等等,也可以使用and(與)、or(或)以及 not(非)。not 可用來對任何邏輯運算符號取反。not 運算子包含在另外乙個邏輯運算子中,這就是不等於(<>)運算子。換句話說,即使不在查詢where 子句中顯式地加入not 詞,not 仍在運算子中,見下例:select * from employee where salary<>3000; 對這個查詢,可以改寫為不使用not:select * from employee where salary<3000 or salary>3000; 雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許對salary 列使用索引,而第一種查詢則不能使用索引。

6)、in 和exists 在where 子句中使用子查詢。在where 子句中可以使用兩種格式的子查詢。第一種格式是使用in 操作符:第二種格式是使用exist 操作符:第二種格式要遠比第一種格式的效率高。應盡可能使用not exists 來代替not in。

7)、條件的順序問題,條件列和索引列的順序要保持對應。

8)、使用union、intersect、minus;消除對大型錶行資料的順序訪問,對連線的列進行索引,還可以使用並集來避免順序訪問。儘管在所有的檢查列上都有索引,但某些形式的where 子句強迫優化器使用順序訪問。下面的查詢將強迫對orders 表執行順序操作:select *from orders where (customer_num=104 and order_num>1001) or order_num=1008 雖然在customer_num 和order_num 上建有索引,但是在上面的語句中優化器還是使用順序訪問路徑掃瞄整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句: select *from orders where customer_num=104 and order_num>1001 union select *from orders where order_num=1008 這樣就能利用索引路徑處理查詢。

其他注意事項:

1)、精確查詢列及查詢條件, 禁用萬用字元*;

2)、在滿足業務邏輯的情況下,分割事務大小,及時提交事務;

3)、及時釋放使用者鎖和資源,減少使用者鎖的使用;

4)、對外鍵建立相應順序的索引;

5)、在可能的情況下修改不合理資料庫系統的結構;

6)、使用臨時表加速查詢

SQL調優之八 關於SQL調優

sql調優是指對未達到預期的sql語句進行診斷和修復 sql調優是乙個反覆的過程,是一步一步的將sql語句的效能提公升到預期的目標。它是對乙個已經實施完成了的應用的問題的解決,相反的,應用設計則是在實施之前,就應該已經設定好了安全和效能的目標。一次典型的調優過程,需要達到以下的其中乙個目的 相對的,...

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 查詢按常...