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