【正文】
寫在最后的表將被最先處理。根據(jù)這個(gè)原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾。MANAGER39?! ?高效,) SELECT * FROM EMP E WHERE 25 (SELECT COUNT(*) FROM EMP WHERE MGR=) AND SAL 50000AND JOB = 39。八、在需要無(wú)條件刪除表中數(shù)據(jù)時(shí),用truncate代替delete。例如Where子句中有聯(lián)接的列,即使最后的聯(lián)接值為一個(gè)靜態(tài)值,也不會(huì)使用索引。39。Beill Cliton39。 當(dāng)采用下面這種SQL語(yǔ)句的編寫,Oracle系統(tǒng)就可以采用基于last_name創(chuàng)建的索引。Beill39。Cliton39。%cliton%39。通配符如此使用會(huì)降低查詢速度。在下面的查詢中索引得到了使用: select * from employee where last_name like 39。十一、用EXISTS替代IN 在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率.低效: SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC =39。) 高效: SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO 0 AND EXISTS (SELECT 39。 FROM DEPT WHERE = AND LOC = 39。)十二、用NOT EXISTS替代NOT IN在子查詢中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并. 無(wú)論在哪種情況下,NOT IN都是最低效的 (因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷). 為了避免使用NOT IN ,我們可以把它改寫成外連接(Outer Joins)或NOT EXISTS. 例如: SELECT … FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=39。)。A39。X39。A39。十三、盡可能的用UNIONALL 替換UNION 當(dāng)SQL語(yǔ)句需要UNION兩個(gè)查詢結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UNIONALL的方式被合并, 然后在輸出最終結(jié)果前進(jìn)行排序. 如果用UNION ALL替代UNION, 這樣排序就不是必要了. 效率就會(huì)因此得到提高. 舉例: 低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 39。 UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 39。 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 39。 UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 39。十四、Order by語(yǔ)句建議ORDER BY語(yǔ)句決定了Oracle如何將返回的查詢結(jié)果排序。任何在Order by語(yǔ)句的非索引項(xiàng)或者有計(jì)算表達(dá)式都將降低查詢速度。解決這個(gè)問(wèn)題的辦法就是重寫order by語(yǔ)句以使用索引,也可以為所使用的列建立另外一個(gè)索引,同時(shí)應(yīng)絕對(duì)避免在order by子句中使用表達(dá)式。NOT可用來(lái)對(duì)任何邏輯運(yùn)算符號(hào)取反。VALID39。NOT運(yùn)算符包含在另外一個(gè)邏輯運(yùn)算符中,這就是不等于()運(yùn)算符。INVALID39。 對(duì)這個(gè)查詢,可以改寫為不使用NOT: select * from employee where salary3000 or salary3000。第二種查詢?cè)试SOracle對(duì)salary列使用索引,而第一種查詢則不能使用索引。SMITH%39。SMITH%39。X39。X39。SMITH%39。 十八、如果可以使用where條件,盡量不要在having中限制數(shù)據(jù)十九、盡量不要使數(shù)據(jù)排序引起排序的條件 Order by Group by Union,intersect,minus Distinct二十、使用提示(Hints)對(duì)于表的訪問(wèn),可以使用兩種Hints:FULL 和 ROWID l FULL hint 告訴ORACLE使用全表掃描的方式訪問(wèn)指定表. 例如: SELECT /*+ FULL(EMP) */ * FROM EMP WHERE EMPNO = 7893。 如果一個(gè)大表沒(méi)有被設(shè)定為緩存(CACHED)表而你希望它的數(shù)據(jù)在查詢結(jié)束是仍然停留在SGA中,你就可以使用CACHE hint 來(lái)告訴優(yōu)化器把數(shù)據(jù)保留在SGA中。 例如: SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * FROM WORK。 ORACLE hints 還包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等。第三章oracle和sybase的SQL區(qū)別一、大小寫SYBASE的SQL中數(shù)據(jù)庫(kù)名、表名和列名分大小寫,應(yīng)遵循定義時(shí)的寫法;ORACLE 并不區(qū)分。三、列的選擇ORACLE執(zhí)行數(shù)據(jù)查詢的時(shí)候,SELECT語(yǔ)句必須選擇針對(duì)的數(shù)據(jù)表。從DUAL表選擇數(shù)據(jù)常被用來(lái)通過(guò)SELECT語(yǔ)句計(jì)算常數(shù)表達(dá)式,由于DUAL只有一行數(shù)據(jù),所以常數(shù)只返回一次。x39。x39。 Oracle查詢?nèi)缦滤荆骸 elect 39。 || 39。 From tableName 對(duì)應(yīng)的sybase查詢?nèi)缦滤荆骸 elect 39。 + 39。五、字符串函數(shù)返回字符串長(zhǎng)度函數(shù)sybase: char_length(string) 或datalength(string)oracle: length(string)LENGTH和LENs