Oracle效能最佳化學習筆記之選擇最有效率的表名順序,oracle效能最佳化

來源:互聯網
上載者:User

Oracle效能最佳化學習筆記之選擇最有效率的表名順序,oracle效能最佳化
        選擇最有效率的表名順序(只在基於規則的最佳化器中有效)

        ORACLE的解析器按照從右至左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎資料表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎資料表.當ORACLE處理多個表時, 會運用排序及合并的方式串連它們.首先,掃描第一個表(FROM子句中最後的那個表)並對記錄進行派序,然後掃描第二個表(FROM子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并.

例如:

        表 TAB1:16,384 條記錄、表 TAB2:1 條記錄

        選擇TAB2作為基礎資料表 (最好的方法):執行時間0.96秒

select count(*) from tab1,tab2 
        選擇TAB2作為基礎資料表 (不佳的方法):執行時間26.09秒

select count(*) from tab2,tab1
       如果有3個以上的表串連查詢, 那就需要選擇交叉表(intersection table)作為基礎資料表, 交叉表是指那個被其他表所引用的表.
例如:

      EMP表描述了LOCATION表和CATEGORY表的交集.

SELECT * FROM LOCATION L ,       CATEGORY C,      EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCN
將比下列SQL更有效率:

SELECT * FROM EMP E ,LOCATION L ,       CATEGORY CWHERE  E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCNAND E.EMP_NO BETWEEN 1000 AND 2000
小註:
       本文摘自百度文庫,具體連結木有找到,抱歉。



oracle group by 性可以最佳化

(1) 選擇最有效率的表名順序(只在基於規則的最佳化器中有效):
ORACLE的解析器按照從右至左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎資料表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎資料表。如果有3個以上的表串連查詢, 那就需要選擇交叉表(intersection table)作為基礎資料表, 交叉表是指那個被其他表所引用的表.
(2) WHERE子句中的串連順序.:
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的串連必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
(3) SELECT子句中避免使用 ‘ * ‘:
ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間
(4) 減少訪問資料庫的次數:
ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變數 , 讀資料區塊等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新設定ARRAYSIZE參數, 可以增加每次資料庫訪問的檢索資料量 ,建議值為200
(6) 使用DECODE函數來減少處理時間:
使用DECODE函數可以避免重複掃描相同記錄或重複串連相同的表.
(7) 整合簡單,無關聯的資料庫訪問:
如果你有幾個簡單的資料庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關係)
(8) 重複資料刪除記錄:
最高效的重複資料刪除記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
當刪除表中的記錄時,在通常情況下, 復原段(rollback segments ) 用來存放可以被恢複的資訊. 如果你沒有COMMIT事務,ORACLE會將資料恢複到刪除之前的狀態(準確地說是恢複到執行刪除命令之前的狀況) 而當運用TRUNCATE時, 復原段不再存放任何可被恢複的資訊.當命令運行後,資料不能被恢複.因此很少的資源被調用,執行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)
(10) 盡量多使用COMMIT:
只要有可能,在程式中盡量多使用COMMIT, 這樣程式的效能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 復原段上用於恢複資料的資訊.
b. 被程式語句獲得的鎖
c. redo log buffer 中的空間
d. ORACLE為管理上述3種資源中的內部花費
(11) 用Where子句替換HAVING子句:
避免使用HAVING子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷. (非oracle中)on、where、having這三個都可以加條件的子句中,on是最先執行,where次之,having最後,因為on是先把不合格記錄過濾後才進行統計,它就可以減少......餘下全文>>
 
Oracle查詢速度最佳化問題

不知道你的oracle版本是什麼時候的?
如果是8以前的版本的話,執行計畫是基於規則的。8以上的版本後,在使用的時候大多是基於開銷的。
如果你的是早期版本的oracle的話,你應該這寫:
select *
from ADOPT_NOTICE_INFO a, CHILD_BASIC_INFO b
where b.WELFARE_ID = 15
and a.CHILD_ID=b.ID
怎麼說,才8萬多筆的資料沒這麼差的效能吧,更何況還建了index
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.