【正文】
20 / 20。DEPT39。PK_DEPT39。EMP39。PK_DEPT39。DEPT39。EMP39。在這種情況下,ORACLE將使用全表掃描。LIKELOADING WHEREFROMLOADING索引將不被采用。WHERE子句中,由于SQL返回LOADING列,而它并不存在于IDX_MANAGER索引中,這個SQL的執(zhí)行分兩步,IDX_MANAGER的索引范圍查詢(得到所有符合條件記錄的ROWID)‘BILLMANAGERLOADING它的效率就要比索引唯一掃描低一些。WHERE子句條件包括一系列值,LIKELOADING WHEREFROMLOADING基于非唯一性索引的檢索SCAN)適用于兩種情況:l 索引范圍查詢(INDEX‘ROSELOADINGSELECT在內部,上述SQL將被分成兩步執(zhí)行,首先,LOADING_PKHILL’。=LOADING WHERESELECT建立在LOADING列上的唯一性索引LOADING_PK和建立在MANAGER列上的非唯一性索引IDX_MANAGER。SCAN) 如:表LOADING有兩個索引INDEX(三) 索引訪問方式 Oracle有兩種索引訪問方式l 索引唯一掃描ORACLE采用索引實現(xiàn)了數(shù)據(jù)和存放數(shù)據(jù)的物理位置(ROWID)之間的聯(lián)系。ORACLE采用一次讀入多個數(shù)據(jù)塊的方式優(yōu)化全表掃描。(二)訪問TABLE的方式ORACLE 采用兩種訪問表中記錄的方式:l 全表掃描在CBO模式下,需要經(jīng)常運行ANALYZE 命令來確保數(shù)據(jù)的準確性?;谶@些統(tǒng)計數(shù)據(jù),成本優(yōu)化器可以計算出可獲得的執(zhí)行路徑的成本。它使用ANALYZE語句來生成數(shù)據(jù)庫對象的統(tǒng)計數(shù)據(jù)。基于規(guī)則的優(yōu)化器按照一系列的語法規(guī)則來推測可能執(zhí)行路徑和比較可替換的執(zhí)行路徑?! ∫韵率荗racle查詢: SELECT TRUNC(,1) Truncate FROM DUAL。m的值可以為負,表示截去小數(shù)點左邊m位數(shù)字。) from ;九、sybase的where語句執(zhí)行[ ]正則符號,但是oracle9i不支持。) from ;oracle: select nvl(pro_table_status, 39。字符轉換數(shù)字to_ number(string)八、空值替代函數(shù):sybase中用 isnull(expr1,expr2) oracle 中不能用isnull(),只能用nvl(expr1,expr2)例如:sybase:select isnull(pro_table_status, 39。結果: 1999/09/08 16:25:30 select to_char(sysdate,’yyyymmdd’) from dual。六、日期函數(shù)取當前系統(tǒng)日期時間sybase: getdate() 返回datetime eg:select getdate() oracle: sysdate 返回date eg:select sysdate from dual。SQLMAG39。SQLMAG39。Last Name39。Name39。Last Name39。Name39?! ∷?、連接 Oracle用|| 符號作為連接符,而sybase的連接符是加號:+ 。 FROM dual在sybase中,查詢則是下面這個樣子: SELECT 39。Oracle下的DUAL查詢如下所示: SELECT 39。在Oracle數(shù)據(jù)庫內有一種特殊的表DUAL。二、限制記錄數(shù)量在SYBASE SQL中限制紀錄的數(shù)量,需要用 EXEC SQL SET ROWCOUNT n, 用完需要執(zhí)行EXEC SQL SET ROWCOUNT 0 恢復; 而 ORACLE 中只需要在 SQL中用 SELECT * FROM tbl_name where rowcountn來限制即可。可以根據(jù)具體情況具體使用。 索引hint 告訴ORACLE使用基于索引的掃描方式. 你不必說明具體的索引名稱 例如: SELECT /*+ INDEX(a index_name) */ LODGING FROM LODGING aWHERE MANAGER = ‘BILL GATES39。 通常CACHE hint 和 FULL hint 一起使用。 l ROWID hint 告訴ORACLE使用TABLE ACCESS BY ROWID的操作訪問表. 通常, 你需要采用TABLE ACCESS BY ROWID的方式特別是當訪問大表的時候, 使用這種方式, 你需要知道ROIWD的值或者使用索引。 類似的,DECODE函數(shù)也可以運用于GROUP BY 和ORDER BY子句中.十七、刪除重復記錄DELETE FROM EMP E WHERE (SELECT MIN() FROM EMP X WHERE = )。,NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL FROM EMP WHERE ENAME LIKE 39。,NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,39。 可以用DECODE函數(shù)高效地得到相同結果 SELECT COUNT(DECODE(DEPT_NO,0020,39。 SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE 39。十六、使用DECODE函數(shù)來減少處理時間 使用DECODE函數(shù)可以避免重復掃描相同記錄或重復連接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE 39。 雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。 再看下面這個例子: select * from employee where salary3000。換句話說,即使不在查詢where子句中顯式地加入NOT詞,NOT仍在運算符中,見下例: ... where st