SQL優化的幾種方法


1、對查詢進行優化,應盡量避免全表掃描,首先考慮在where及order by上建立索引。

2、應盡量避免在where子句中進行以下操作:對字段進行null判斷;使用!=或<>操作符;使用or連接條件;使用in或not in;使用like;等號左側使用算術運算;對字段進行函數運算等。以上操作將導致引擎放棄索引而進行全表掃描。

3、不要寫一些沒有意義的查詢,如生成一個空表。

4、使用exists替代in,用not exists替代not in。not in 是低效的,因為它對子查詢中的表執行了一個全表遍歷,他執行了一個內部的排序和合並。select num from a where exists(select 1 from b where num=a.num)

5、對只含數值信息的字段盡量使用數值型代替字符型,否則會降低查詢和連接性能。

6、盡可能使用varchar代替char,節約存儲空間,提高效率。

7、盡量用具體字段代替*進行查詢。

8、在使用索引字段作為條件時,如果索引是復合索引,必須使用該索引的第一個字段作為條件才能保證系統使用該索引。

9、當索引中有大量重復數據時,索引是無效的。

10、當進行update或insert操作時,索引的存在會降低該操作的效率。

11、盡量避免頻繁創建或刪除臨時表,減少系統資源消耗。

12、在新建臨時表時,如果一次性插入數據量很大,那么可以使用select into代替create table,避免產生大量log,提高效率。

13、如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯示的刪除,先truncate table ,然后drop table,避免系統表長時間鎖定。

14、盡量避免使用游標,因為游標效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。

15、對於小型數據集使用fast_forward游標要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲取所需要的數據時。

16、表名順序。選擇最有效率的表名順序,from后面先跟大表,再跟小表,因為from子句中寫在最后的表被優先處理,from后跟多個表的情況下,應該選擇記錄條數最少的表作為優先處理的表;

17、where子句連接順序。那些可以過濾最大數量記錄的條件必須寫在where子句的末尾;

18、高效刪除重復記錄。最高效的刪除重復記錄方法 ( 因為使用了ROWID)例子:delete from emp a where a.rowid>(select min(b.rowid) from emp b where a.emp_no=b.emp_no);

19、使用truncate替代delete。當用delete刪除表中記錄時,回滾段rollback用來被存放可以被恢復的信息,如果你不執行commit,oracle會將數據恢復到刪除之前的狀態;當運行truncate時,回滾段不再存放任何可被恢復的信息,當運行truncate時,數據不再被恢復,此時很少的資源被調用,執行時間也會很短;

20、盡量多使用commit。隨着commit的多次使用,系統資源被釋放,性能會提高;

21、用where子句替換having子句。having只會在檢索出所有記錄之后才對結果集進行過濾。on、where、having這三個都是刪選條件的子句,on最先執行,where次之,hiving最后;on先把不符合條件的記錄過濾才進行統計,它可以減少中間運算要處理的數據,on的使用僅限於多表連接;where也是過濾數據后才進行sum;hiving是在計算之后才啟作用;

22、使用表的別名。當sql語句中連接多個表時,請使用表的別名並用別名前綴識別每個column,這樣可以減少sql解析時間,避免歧義;

23、用>=替代>

高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3

前者DBMS將直接跳到第一個DEPT等於4的記錄而后者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄。

24、用union all替換union。當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合並,然后在輸出最終結果前進行排序。如果用UNION ALL替代UNION,這樣排序就不是必要了。效率就會因此得到提高。

25、當使用join(inner join或left join)操作時,就應該是小表在前,大表在后。把重復關聯鍵少的表放在join前面做關聯可以提高join的效率。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM