【正文】
構(gòu)索引是有必要的.: ALTER INDEX INDEXNAME REBUILD TABLESPACENAME ?。?8) 用EXISTS替換DISTINCT: 當(dāng)提交一個(gè)包含一對(duì)多表信息(比如部門表和雇員表)的查詢時(shí),避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換, EXISTS 使查詢更為迅速,因?yàn)镽DBMS核心模塊將在子查詢的條件一旦滿足后,立刻返回結(jié)果. 例子: (低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE = (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X’ FROM EMP E WHERE = )。系統(tǒng)首先根據(jù)各個(gè)表之間的聯(lián)接條件,把多個(gè)表合成一個(gè)臨時(shí)表后,再由where進(jìn)行過(guò)濾,然后再計(jì)算,計(jì)算完后再由having進(jìn)行過(guò)濾?! 。?9) sql語(yǔ)句用大寫的;因?yàn)閛racle總是先解析sql語(yǔ)句,把小寫的字母轉(zhuǎn)換成大寫的再執(zhí)行 (20) 在java代碼中盡量少用連接符“+”連接字符串! (21) 避免在索引列上使用NOT 通常, 我們要避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描. ?。?2) 避免在索引列上使用計(jì)算. WHERE子句中,如果索引列是函數(shù)的一部分.優(yōu)化器將不使用索引而使用全表掃描. 舉例: 低效: SELECT … FROM DEPT WHERE SAL * 12 25000。在多表聯(lián)接查詢時(shí),on比where更早起作用。 高效: SELECT … FROM DEPT WHERE SAL 25000/12。在這單表查詢統(tǒng)計(jì)的情況下,如果要過(guò)濾的條件沒(méi)有涉及到要計(jì)算字段,那它們的結(jié)果是一樣的,只是where可以使用rushmore技術(shù),而having就不能,在速度上后者要慢如果要涉及到計(jì)算的字段,就表示在沒(méi)計(jì)算之前,這個(gè)字段的值是不確定的,根據(jù)上篇寫的工作流程,where的作用時(shí)間是在計(jì)算之前就完成的,而having就是在計(jì)算后才起作用的,所以在這種情況下,兩者的結(jié)果會(huì)不同?! 。?3) 用=替代 高效: SELECT * FROM EMP WHERE DEPTNO =4 低效: SELECT * FROM EMP WHERE DEPTNO 3 兩者的區(qū)別在于, 前者DBMS將直接跳到第一個(gè)DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個(gè)DEPT大于3的記錄. ?。?4) 用UNION替換OR (適用于索引列) 通常情況下, 用UNION替換WHERE子句中的OR將會(huì)起到較好的效果. 對(duì)索引列使用OR將造成全表掃描. 注意, 以上規(guī)則只針對(duì)多個(gè)索引列有效. 如果有column沒(méi)有被索引, 查詢效率可能會(huì)因?yàn)槟銢](méi)有選擇OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10