1*號引起的執(zhí)行效率
? ? 盡量減少使用select * 來進行查詢,當你查詢使用*,數(shù)據(jù)庫會進行解析并將*轉(zhuǎn)換為全部列。因此盡量寫明你所需要查詢的字段名。
SELECT * FROM EMP;
SELECT EMP.NO FROM EMP;
2避免在索引列上使用計算
WHERE 子句中,如果索引列是函數(shù)的一部分.優(yōu)化器將不使用索引而使用全表掃描.
舉例 :
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效 :
SELECT … FROM DEPT WHERE SAL > 25000/12;
3用 >= 替代 >
高效 :
SELECT * FROM EMP WHERE DEPTNO >=4
低效 :
SELECT * FROM EMP WHERE DEPTNO >3
兩者的區(qū)別在于 , 前者 DBMS 將直接跳到第一個 DEPT 等于 4 的記錄而后者將首先定位到 DEPTNO=3 的記錄并且向前掃描到第一個 DEPT 大于 3 的記錄 .
4where執(zhí)行順序
where執(zhí)行會從至下往上執(zhí)行
SELECT * FROM STUDENT_INFO SI--學(xué)生信息表
WHERE SI.SCHOOL_ID=10 --學(xué)院ID
AND SI.SYSTEM.ID=100--系ID
擺放where子句時,把能過濾大量數(shù)據(jù)的條件放在最下邊
5from字段中的優(yōu)化:
Oracle安照從右到左的順序加載表數(shù)據(jù),應(yīng)該把可以排除數(shù)據(jù)最多的表放到后面(基礎(chǔ)表)。
比如,在關(guān)聯(lián)查詢中,把課程表放到后面,成績表放到前面,因為課程表數(shù)據(jù)一般比較少,關(guān)聯(lián)的時候可以快速的過濾掉一些成績數(shù)據(jù)。因此把簡單的數(shù)據(jù)少的基礎(chǔ)表放在右側(cè)可以提高速度。
當出現(xiàn)多個表時,關(guān)聯(lián)表被稱之為交叉表,交叉表作為基礎(chǔ)表。
6where執(zhí)行速度比having快
盡可能的使用where代替having,having只會在檢索出所有記錄之后才會對結(jié)果集進行過濾,這個過程需要排序,總計等操作。
7替換
用in 代替or
SELECT UI.USER_NAME
FROM USER_INFO UI--員工信息表
WHERE UI.STUDENT_ID=10
OR UI.STUDENT_ID=20
OR UI.STUDENT_ID=30
改成
SELECT UI.USER_NAME
FROM USER_INFO UI--員工信息表
WHERE UI.STUDENT_ID IN (10,20,30)
執(zhí)行會更有效率。
8優(yōu)化GROUP BY:
提高GROUP BY語句的效率,可以通過將不需要的記錄在GROUP BY之前過濾掉.
關(guān)于索引,感覺里面的問題比較復(fù)雜,還沒有詳細了解。