SQL性能優化

1.避免使用count(*)得到表的記錄數java

(1)爲了得到表中的記錄數,咱們一般使用下面的SQL語句:sql

SELECT COUNT(*) FROM dbo.orders

這條語句會執行全表掃描才能得到行數。oracle

(2)但下面的SQL語句不會執行全表掃描同樣能夠得到行數:函數

SELECT rows FROM sysindexes

  WHERE id =OBJECT_ID('dbo.Orders') AND indid <2


2.使用union實現or操做性能

  (1)在查詢中儘可能不要使用or,使用union合併兩個不一樣的查詢結果集,這樣查詢性能會更好;spa

  (2)若是不是必需要不一樣的結果集,使用union all效果會更好,由於它不會對結果集排序。code

3.索引問題排序

法則:不要在創建的索引的數據列上進行下列操做:索引

◆避免對索引字段進行計算操做io

◆避免在索引字段上使用not,<>,!=

◆避免在索引列上使用IS NULL和IS NOT NULL

◆避免在索引列上出現數據類型轉換

◆避免在索引字段上使用函數

◆避免創建索引的列中使用空值。

4.NOT IN操做符

此操做是強列推薦不使用的,由於它不能應用表的索引。

推薦方案:用NOT EXISTS 或(外鏈接+判斷爲空)方案代替

5.<> 操做符(不等於)

不等於操做符是永遠不會用到索引的,所以對它的處理只會產生全表掃描。

推薦方案:用其它相同功能的操做運算代替,如

a<>0 改成 a>0 or a<0

a<>’’ 改成 a>’’

IS NULL 或IS NOT NULL操做(判斷字段是否爲空)

判斷字段是否爲空通常是不會應用索引的,由於B樹索引是不索引空值的。

6.LIKE操做符

LIKE操做符能夠應用通配符查詢,裏面的通配符組合可能達到幾乎是任意的查詢,可是若是用得很差則會產生性能上的問題,如LIKE ‘%5400%’ 這種查詢不會引用索引,而LIKE ‘X5400%’則會引用範圍索引。一個實際例子:用YW_YHJBQK表中營業編號後面的戶標識號可來查詢營業編號 YY_BH LIKE ‘%5400%’ 這個條件會產生全表掃描,若是改爲YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 則會利用YY_BH的索引進行兩個範圍的查詢,性能確定大大提升。

7.用EXISTS替換DISTINCT:
當提交一個包含一對多表信息(好比部門表和僱員表)的查詢時,避免在SELECT子句中使用DISTINCT. 通常能夠考慮用EXIST替換, EXISTS 使查詢更爲迅速,由於RDBMS核心模塊將在子查詢的條件一旦知足後,馬上返回結果. 例子:
      (低效):
SELECT  DISTINCT  DEPT_NO,DEPT_NAME  FROM  DEPT D , EMP E
WHERE  D.DEPT_NO = E.DEPT_NO
(高效):
SELECT  DEPT_NO,DEPT_NAME  FROM  DEPT D  WHERE  EXISTS ( SELECT ‘X'
FROM  EMP E  WHERE E.DEPT_NO = D.DEPT_NO);
8. sql語句用大寫的;由於oracle老是先解析sql語句,把小寫的字母轉換成大寫的再執行

相關文章
相關標籤/搜索