選擇最有效率的表名順序(只在基於規則的優化器中有效)
oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理. 在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當oracle處理多個表時, 會運用排序及合併的方式連線它們.首先,掃瞄第乙個表(from子句中最後的那個表)並對記錄進行派序,然後掃瞄第二個表(from子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第乙個表中合適記錄進行合併.
例如: 表 tab1 16,384 條記錄 表 tab2 1 條記錄
選擇tab2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇tab2作為基礎表 (不佳的方法)
select count(*) from tab2,tab1 執行時間26.09秒
如果有3個以上的表連線查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所用的表. 例如:
emp表描述了location表和category表的交集.
select * from location l , category c, emp e
where e.emp_no between 1000 and 2000 and e.cat_no = c.cat_no and e.locn = l.locn
將比下列sql更有效率
select * from emp e , location l , category c
where e.cat_no = c.cat_no and e.locn = l.locn and e.emp_no between 1000 and 2000
SQL優化常用方法38
避免在索引列上使用is null和is not null 避免在索引中使用任何可以為空的列,oracle將無法使用該索引 對於單列索引,如果列包含空值,索引中將不存在此記錄.對於復合索引,如果每個列都為空,索引中同樣不存在此記錄.如果至少有乙個列不為空,則記錄存在於索引中 舉例 如果唯一性索引建立在...
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...