1. 程式人生 > >數據庫優化SQL

數據庫優化SQL

解析過程 位圖 聯合 col 運算 _id code 復合 復合索引

sql優化規則:

1.對於查詢,盡量不要使用全表掃描,盡量在where子句以及order by所對應的字段建立索引。

2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描。

  最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫.備註、描述、評論之類的可以設置為 NULL,其他的,最好不要使用NULL

一些限制索引的寫法如下:

   ①使用不等運算符(<> !=)

  ②使用IS NULL或者is notnull做判斷。比如NVL等

  ③使用函數

select  t.* from
eb_bill_app t where substr(t.apply_id,1,6) =201805

  ④比較不匹配的數據類型.本來該類型為char,卻使用int比較,oracle自動調用to_number函數,導致不使用索引(字符型字段為數字時在where條件裏不添加引號)。

  ⑤like "%_" 百分號在前。

  ⑥not in ,not exist.

  ⑦單獨引用復合索引裏非第一位置的索引列

  ⑧B-tree索引 is null不會走,is not null會走,位圖索引 is null,is not null 都會走。聯合索引 is not null 只要在建立的索引列(不分先後)都會走。

  ⑨應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描

3.select語句中避免使用*,因為oracle在解析過程中會將*轉換為所有的列名。

4.盡量多使用commit,,在事務控制允許的範圍內,commit有利於釋放資源。

5.使用表別名,減少由column引起的歧義。

6.避免使用having

7.對於多張大數據量(這裏幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

8.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

9.如果數據量過大,優先考慮表分區

待補充。。。

數據庫優化SQL