sql優化
1、SELECT子句中避免使用 *, 盡量應該根據業務需求按字段進行查詢
2、盡量多使用COMMIT如對大資料量的分段批量送出釋放了資源,減輕了伺服器壓力
3、在寫sql語句的話,盡量保持每次查詢的sql語句字段用大寫,因為oracle總是先解析 sql語句,把小寫的字母轉換成大寫的再執行
4、用UNION-ALL 替換UNION,因為UNION-ALL不會過濾重複資料,所執行效率 要快于UNION,并且UNION可以自動排序,而UNION-ALL不會
5、避免在索引列上使用計算和函數,這樣索引就不能使用
Sql優化精簡版:
1.(重點)SELECT語句中避免使用 *,
盡量應該根據業務需求按字段進行查詢
舉例:如果表中有個字段用的是clob或者是blob這種大資料字段的話,
他們的查詢應該根據業務需要來進行指定字段的查詢,切記勿直接用*
2.(重點) 删除重複記錄(oracle):
最高效的删除重複記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
3. 用>=替換>
如一個表有100萬記錄,一個數值型字段A,
A=0時,有30萬條;
A=1時,有30萬條;
A=2時,有39萬條;
A=3時,有1萬記錄。
那麼執行 A>2 與 A>=3 的效果就有很大的差別了,因為 A>2 時,
ORACLE會先找出為2的記錄索引再進行比較,
而A>=3時ORACLE則直接找到=3的記錄索引。
4.(重點)盡量多使用COMMIT
如對大資料量的分段批量送出
5. (重點)用NOT EXISTS 或(外連接配接+判斷為空)方案 替換 NOT IN操作符
此操作是強列推薦不使用的,因為它不能應用表的索引。
推薦方案:用NOT EXISTS 或(外連接配接+判斷為空)方案代替
6.(重點 )LIKE操作符(大資料的全文檢索使用luncene)(solr)
因為使用like不當,會導緻性能問題,原因是like在左右兩邊都有
%的時候,不會使用索引。
如LIKE '%5400%' 這種查詢不會引用索引,
而LIKE 'X5400%' 則會引用範圍索引。
一個實際例子:
查詢營業編号 YY_BH LIKE '%5400%' 這個條件會産生全表掃描,
如果改成 YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'
則會利用 YY_BH 的索引進行兩個範圍的查詢,性能肯定大大提高。
7.(重點)避免在索引列上使用計算和函數,這樣索引就不能使用
舉例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重點)用UNION-ALL 替換UNION,
因為UNION-ALL不會過濾重複資料而且不會自動排序,
所執行效率要快于UNION。
9. (優化,重點,3個方面 a.緩存 b.分段批量 c.存儲過程)減少通路資料庫的次數
舉例:如果批量删除多條資料,可以用 delete from tableName where id
in (1,2,3)
而不要用多條delete語句進行删除
10.(重點)用TRUNCATE替代DELETE
TRUNCATE不記錄日志,DELETE記錄日志,是以TRUNCATE要快于DELETE
但是一旦用TRUNCATE進行删除就不能進行恢複,TRUNCATE是删除整張表的資料
不能加where條件。
==================================================================
mysql,sqlserver中如果
id為自增類型,那麼如果用TRUNCATE删除,則id字段再插入資料時從1開始,
如果delete删除的話,則從删除之前的id的值繼續增長。