Oracle 語句優化(整理1)

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之前過濾掉.


關于索引,感覺里面的問題比較復雜,還沒有詳細了解。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 5.多表查詢 多表查詢 目的:從多張表獲取數據 前提:進行連接的多張表中有共同的列 等連接 通過兩個表具有相同意義...
    喬震閱讀 1,296評論 0 0
  • 查詢是數據的一個重要操作。用戶發送查詢請求,經編譯軟件變異成二進制文件供服務器查詢,后返回查詢結果集給用戶,查詢會...
    產品小正閱讀 1,431評論 0 2
  • 1. select * from emp; 2. select empno, ename, job from em...
    海納百川_4d26閱讀 1,932評論 0 4
  • mysql數據庫中 :database : 文件夾table : 數據表(數據文件) 進入mysqlmysql -...
    賦閑閱讀 579評論 0 0
  • 1.簡介 數據存儲有哪些方式?電子表格,紙質文件,數據庫。 那么究竟什么是關系型數據庫? 目前對數據庫的分類主要是...
    喬震閱讀 1,764評論 0 2