一,關於索引:
使用索引的合理性:
條件子句中變數順序應與索引字鍵順序相同。(儘可能在join和order by 的欄位上建立索引)將最具有限制性的條件放在前面,大值在前,小值在後。
eg:…where O.a <1000 and O.a>200 效率高於 where O.a>200 and O.a<1000
…where O.a between 200 and 1000 效率高於 where O.a>200 and O.a<1000
二,關於萬用字元:
避免採用MATCHES和LIKE萬用字元匹配查詢:
由於採用like等萬用字元查詢時,sql最佳化器實際上還是用順序搜尋的方法來查詢的,也就是說,在被查詢的欄位上建立的索引實際上是不起作用的。
eg:…where O.b <'12399' and O.b>'123000 ' 效率高於 where O.b matche '123*'
三,關於子查詢:
查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。假如子查詢不可避免,那麼要在子查詢中過濾掉儘可能多的行。
eg:…from O1,O2 where O1.c=O2.c and O2.a=2009 效率高於 from O1 where O1.c in(select O2.c from O2 where O2.a=2009)
四,關於順序存取時的巢狀查詢:
在進行大資料量的索引歸類時,有些形式的where子句會強迫最佳化器使用順序存取,從而使得原索引欄位失效。
eg:…where (O.d = 123 and O.a>200 ) union O.b=1010 效率高於 where (O.d = 123 and O.b>200) or O.b=1010
五,關於暫存資料表:
使用暫存資料表加速查詢
把表的一個子集進行排序並建立暫存資料表,有時能加速查詢。注意:暫存資料表建立後不會反映主表的修改。在主表中資料頻繁修改的情況下,注重不要遺失資料。
eg:…select unique tO1 into temp tO1 "然後(then)"select count(*)from temp tO1 效率高於select count(distinct)
六,關於聚集合函式:
1.對於大資料量的求和應避免使用單一的sum命令處理,可採用group by方式與其結合,有時會大大提高效率。
2.避免會引起磁碟讀寫的 rowid* 等操作。在where子句中或select語句中,用rowid要產生磁碟讀寫,是一個物理過程,會影響sql效能。