任何對列的操作都可能導致全表掃描,這裡所謂的操作包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等式的右邊,
甚至去掉函數。
例1:下列SQL條件語句中的列都建有恰當的索引,但30萬行數據情況下執行速度卻非常慢:
select * from record where substrb(CardNo,1,4)='5378'(13秒) select * from record where amount/30< 1000(11秒) select * from record where to_char(ActionTime,'yyyymmdd')='19991201'(10秒)
由於where子句中對列的任何操作結果都是在SQL運行時逐行計算得到的,因此它不得不進行表掃描,而沒有使用該列上面的索引;
如果這些結果在查詢編譯時就能得到,那麼就可以被SQL優化器優化,使用索引,避免表掃描,因此將SQL重寫如下:
select * from record where CardNo like '5378%'(< 1秒) select * from record where amount < 1000*30(< 1秒) select * from record where ActionTime= to_date ('19991201' ,'yyyymmdd')(< 1秒)