避免在索引列上使用is null和is not null
避免在索引中使用任何可以為空的列,oracle將無法使用該索引 .對於單列索引,如果列包含空值,索引中將不存在此記錄. 對於復合索引,如果每個列都為空,索引中同樣不存在此記錄. 如果至少有乙個列不為空,則記錄存在於索引中.
舉例: 如果唯一性索引建立在表的a列和b列上, 並且表中存在一條記錄的a,b值為(123,null) , oracle將不接受下一條具有相同a,b值(123,null)的記錄(插入). 然而如果所有的索引列都為空,oracle將認為整個鍵值為空而空不等於空. 因此你可以插入1000條具有相同鍵值的記錄,當然它們都是空!因為空值不存在於索引列中,所以where子句中對索引列進行空值比較將使oracle停用該索引. 舉例:
低效: (索引失效) select … from department where dept_code is not null;
高效: (索引有效) select … from department where dept_code >=0;
SQL優化常用方法36
用union替換or 適用於索引列 通常情況下,用union替換where子句中的or將會起到較好的效果.對索引列使用or將造成全表掃瞄.注意,以上規則只針對多個索引列有效.如果有column沒有被索引,查詢效率可能會因為你沒有選擇or而降低.在下面的例子中,loc id 和region上都建有索引...
SQL優化常用方法18
用exists替代in 在許多基於基礎表的查詢中,為了滿足乙個條件,往往需要對另乙個表進行聯接.在這種情況下,使用exists 或not exists 通常將提高查詢的效率.低效 select from emp 基礎表 where empno 0 and deptno in select deptn...
SQL優化常用方法5
where子句中的連線順序 oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.例如 低效,執行時間156.3秒 select from emp e where sal 50000 ...