天天看點

sql的一些有優化技巧

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的值繼續增長。