1.
(*)選擇最有效率的表名順序(只在基於規則的優化器中有效)
oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理. 在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當oracle處理多個表時, 會運用排序及合併的方式連線它們.首先,掃瞄第乙個表(from子句中最後的那個表)並對記錄進行排序,然後掃瞄第二個表(from子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第乙個表中合適記錄進行合併.
例如:
表 tab1 16,384 條記錄
表 tab2 1 條記錄
選擇tab2作為基礎表 (最好的方法)
select count(*) from tab1,tab2 執行時間0.96秒
選擇tab1作為基礎表 (不佳的方法)
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
2. (*)where子句中的連線順序.
oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.
例如:
(低效,執行時間156.3秒)
select … from emp e
where sal > 50000
and job = 『manager'
and 25 < (select count(*) from emp where mgr=e.empno);
(高效,執行時間10.6秒)
select … from emp e
where 25 < (select count(*) from emp where mgr=e.empno)
and sal > 50000
and job = 『manager';
ORACLE SQL執行步驟
以前理解的 oracle sql 的處理過程大致如下 1.運用hash演算法,得到乙個hash值,這個值可以通過v sqlarea.hash value 檢視 2.到shared pool 中的 library cache 中查詢是否有相同的hash值,如果存在,則無需硬解析,進行軟解析 3.如果s...
Oracle sql執行過程
每種型別的語句都要執行的全過程 1 create a cursor 建立游標 2 parse the statement 分析語句 5 bind any variables 繫結變數 7 run the statement 執行語句 9 close the cursor 關閉游標 如果使用了並行功能...
Oracle sql執行計畫
explain plan explain plan for sql statement select from table dbms xplan.display dbms xplan包 1.select from table dbms xplan.display 2.select from tabl...