清談Oracle FROM子句
Oracle還是比較常用的,于是我研究了一下Oracle FROM子句,在這里拿出來和大家分享一下,希望對大家有用。我們要做到不但會寫SQL,還要做到寫出性能優(yōu)良的SQL語句。
1.選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效):
Oracle的解析器按照從右到左的順序處理Oracle FROM子句中的表名,Oracle FROM子句中寫在***的表(基礎(chǔ)表 driving table)將被***處理,在Oracle FROM子句中包含多個表的情況下,您必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表。假如有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎(chǔ)表,交叉表是指那個被其他表所引用的表。
2.WHERE子句中的連接順序:
Oracle采用自下而上的順序解析WHERE子句,根據(jù)這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些能夠過濾掉***數(shù)量記錄的條件必須寫在WHERE子句的末尾。
3.SELECT子句中避免使用‘*’:Oracle在解析的過程中, 會將‘*’依次轉(zhuǎn)換成任何的列名, 這個工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費更多的時間。
4.減少訪問數(shù)據(jù)庫的次數(shù):Oracle在內(nèi)部執(zhí)行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數(shù)據(jù)塊等。
5.在SQL*Plus , SQL*Forms和Pro*C中重新配置ARRAYSIZE參數(shù), 能夠增加每次數(shù)據(jù)庫訪問的檢索數(shù)據(jù)量 ,建議值為200。
6.使用DECODE函數(shù)來減少處理時間:使用DECODE函數(shù)能夠避免重復(fù)掃描相同記錄或重復(fù)連接相同的表。
7.整合簡單,無關(guān)聯(lián)的數(shù)據(jù)庫訪問:假如您有幾個簡單的數(shù)據(jù)庫查詢語句,您能夠把他們整合到一個查詢中(即使他們之間沒有關(guān)系)。
8.刪除重復(fù)記錄:***效的刪除重復(fù)記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
9.用TRUNCATE替代DELETE:
當(dāng)刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放能夠被恢復(fù)的信息. 假如您沒有COMMIT事務(wù),Oracle會將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)(準(zhǔn)確地說是恢復(fù)到執(zhí)行刪除命令之前的狀況) 而當(dāng)運用TRUNCATE時, 回滾段不再存放任何可被恢復(fù)的信息。當(dāng)命令運行后,數(shù)據(jù)不能被恢復(fù).因此很少的資源被調(diào)用,執(zhí)行時間也會很短。(TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)。以上介紹Oracle FROM子句。
【編輯推薦】