程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 討論Oracle Exists用法

討論Oracle Exists用法

編輯:Oracle數據庫基礎

學習Oracle時,經常會遇到Oracle Exists問題,這裡將介紹Oracle Exists問題的解決方法。Oracle使用了一個復雜的自平衡B-tree結構。通常,通過索引查詢數據比全表掃描要快。當 Oracle找出執行查詢和Update語句的最好路徑時,Oracle優化器將使用索引。同樣在聯結多個表時使用索引也能夠提高效率。

另一個使用索引的好處是,他提供了主鍵(primary key)的唯一性驗證。那些LONG或LONG RAW數據類型, 您能夠索引幾乎任何的列。通常, 在大型表中使用索引特別有效. 當然,您也會發現, 在掃描小表時,使用索引同樣能提高效率。

雖然使用索引能得到查詢效率的提高,但是我們也必須注意到他的代價。索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改。這意味著每條記錄的INSERT,DELETE ,UPDATE將為此多付出4、5次的磁盤I/O 。因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。定期的重構索引是有必要的:

  1. ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME> 

用Oracle Exists替換DISTINCT:

當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT。一般能夠考慮用Oracle EXIST替換,Oracle Exists使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足後,立即返回結果。例子:

  1. SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO 
  2. SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE Exists 
    ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); 

◆SQL語句用大寫的;因為Oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。
◆在Java代碼中盡量少用連接符“+”連接字符串。
◆避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響。
◆當Oracle“碰到”NOT,他就會停止使用索引轉而執行全表掃描。
◆避免在索引列上使用計算。WHERE子句中,假如索引列是函數的一部分。優化器將不使用索引而使用全表掃描。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved