商業智能領域需要了解的數據庫優化理論

     由於數據倉庫系統存儲大量的歷史數據和當前數據,並且數據量在不斷增加,爲了提高數據存儲、檢索的運行效率,建立一個優良的數據倉庫系統,數據倉庫設計人員和開發人員需要掌握Oracle優化理論方面的知識,這有助於設計、開發出高性能的數據倉庫系統。

 

1          外部優化原則

CPU是直接影響數據庫性能的外部因素,同時Oracle的內存大小也會影響SQL查詢的

效率,大量的Net8通信同樣會使SQL的性能變差。

         下面介紹外部優化原則的具體調整方法。

1)  適當增加服務器CPU的數量,服務器的性能會受CPU的限制,最好的方法就是爲服務器增加額外的CPU,或者關閉很多等待處理資源的各種組件,以減少CPU資源的浪費。

2)  當內存分頁時,如果內存容量不足,最好的方法就是增加更多的內存,減小SGA的大小,或者關閉Oracle多線程服務器,以提高數據庫系統的運行效率。

2          SQL優化基本規則

1)  在對大表進行全表搜索時,爲了避免不必要的全表搜素而導致的大量I/O操作,最常見的調優方法是適量增加索引,加快查詢的速度,以提高數據庫運行的效率。

2)  保證最優的索引使用,對於改善查詢的速度和提高數據庫的性能是至關重要的。在某些情況下也可以選擇多個索引進行查詢,還包括位圖索引和基於函數索引的使用。

3          SQL使用規範

1)  儘量避免使用遊標。因爲遊標的效率較差,如果遊標操作的數據超過1W行,那麼就應該採用其他的方法:如果使用了遊標,還要儘量避免在遊標循環中再進行表連接的操作。

2)  不要在where子句中的”=”左邊進行函數、算術運算或其他表達式運算,否則數據庫系統可能無法正常使用索引。

3)  儘量使用exists代替select count(*)語句來判斷表中是否存在滿足條件的記錄。Count函數只有統計表中所有行數時才使用,而且count(1)count(‘X’)count(*)更有效率。

4)  注意表之間關聯字段的數據類型,避免使用不同類型的字段作爲關聯條件進行多表連接。

4          索引使用規範

1)  索引的創建要與實際應用情況結合考慮,建議大的聯機事務處理系統(OLTP)表最好不要超過6個索引,以免系統增加不必要的負擔。

2)  儘可能使用索引字段作爲查詢條件,以提高查詢效率。

3)  儘量避免在大表查詢時使用全表掃描的方式,必要時可以考慮重建索引。

4)  注意索引的定期維護,可以週期性地重建索引和重新編譯存儲過程。

例如使用:

  SELECT ‘ALTER INDEX’||index_name||’REBUILD;’

  FROM user_indexes

語句查詢出當前用戶下所有的索引重建語句,然後在SQL窗口下一條執行該重建索引語句。

5          臨時表使用規範

1)  儘量避免在臨時表中使用distinctorder bygroup byhavingjoin,因爲這些語句會加重臨時表的負擔。同時也儘量避免臨時表的頻繁創建和刪除,以減少系統表資源的消耗。

2)  在新建臨時表時,如果一次性插入數據量非常大,那麼可以使用select into語句替代create table語句,避免對日誌的大量操作,可以縮短運行的時間;如果數據量並不大,爲了緩和系統表的資源消耗,建議先創建臨時表,然後再進行插入操作。

3)  如果臨時表的數據量較大,則需要爲臨時表建立相應的索引,同時保證數據庫系統對該臨時表索引的使用。

4)  如果存儲過程中使用了臨時表,在代碼的結尾處,一定要將所有的臨時表都刪除,通常的做法是先執行truncate table語句,然後再執行drop table語句,這樣就可以避免數據庫系統較長時間鎖定臨時表與其他表的連接查詢和關聯,從而減輕數據庫系統的負擔。

6          索引創建原則

索引創建原則如圖:

1)  先插入數據,再進行索引的創建工作。

2)  限制每個表的索引數量,避免大量的索引導致數據庫系統的性能降低。

3)  爲每個索引指定表空間,這樣有利於避免發生I/0衝突。

4)  定期重建索引,以減少索引的碎片,提高數據庫系統的性能,一般來說,枚舉類型的字段可以考慮使用位圖索引,而非二叉樹類索引。

7       大數據量表的維護原則

 

1)  如果是超大數據量的表,並且經常進行增加、刪除、修改、查詢等操作,最好的辦法就是定期收集統計信息傳遞給Oracle優化器,以提高數據庫系統的性能。

2)  如果是大數據量的表,可以考慮使用按照時間或者哈希的分區技術,並且將不同的分區放入到規定的表空間中,以提高數據庫查詢的效率。

8          視圖創建原則

1)  絕對禁止在視圖的基礎上再創建視圖,這樣會嚴重影響數據庫的性能。

2)  推薦使用物化視圖技術,以提高數據庫表查詢的效率,但是物化視圖刷新的頻率不能過高,因爲這樣也會影響整個數據庫系統的性能。

3)  爲保證數據的一致性和安全性,推薦將普通視圖設置成只讀類型,不能做任何刪除操作。

9          代碼程序中使用索引的原則

1)  儘量少用in操作符。使用exists替代in操作符,使查詢的子表能夠使用索引,提高數據庫表查詢的效率。

2)  where條件的後面儘量不用<>!=。例如,條件count<0可以修改成count>0 or count<0,這樣可以發揮索引的作用,提高數據庫表查詢的效率。

3)  Like語句儘量不要使用通配符“%”或者“_”作爲查詢條件的第一個字符。例如,count like ‘%100%’,這個條件會對數據庫表進行全表掃描,嚴重影響了數據庫表查詢的性能,可以修改成count like ‘2100%’ or count like ‘3100%’,這樣count字段會利用該字段上的索引進行不同範圍的查詢,大大提高了數據庫表的查詢效率。

4)  因爲運算的字段不能進行任何索引,所以where子句應該儘量避免在索引字段上做任何計算。例如,substr(count,1,3)=’100’可以修改成count like ‘100%’

5)  where條件的後面,一般將表連接語句寫在最前面,將可以濾掉大量記錄的條件寫在最後。因爲Oracle進行多表查詢時,是從後往前執行SQ代碼的。

10      代碼程序中的一些建議

1)  儘量不使用select *語句,最好的辦法是將要查詢的字段全部列出,以提高SQL運行的效率。因爲Oracle在解析的過程中,會將“*”依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味着將耗費更多的時間和數據庫資源。

2)  儘量多使用execute immediate語句,可以提高SQL執行的效率。

3)  在使用遊標時,如果將大量的數據集合賦給遊標,運行時一般會出現內存溢出的報錯信息。這時需要調整緩衝區的大小,所以使用遊標時要注意內存大小的問題。

4)  對於超大數據量的表應該每隔一段時間執行一次收集統計信息的操作。例如,執行dbms_stats.gather_table_stats命令,將統計信息傳遞給Oracle優化器,以提高數據庫系統的性能。

5)  面向對象的最佳實踐方法是爲每個屬性都定義一個get方法,但是不能把面向對象的實現方法應用於關係型數據庫中。關係型數據庫中的表不能等同於面向對象中的類,表中的字段同樣不能等同於類的屬性,因此查詢數據表中的字段時,應該一次性全部取出。

6)  謹慎使用自定義的函數。自定義函數通常會影響優化器對查詢的優化作用。

7)  檢查滿足某個條件的記錄是否存在,絕對不要使用select count(*)語句去判斷,可以考慮使用merge語句判斷該記錄是否存在。

總之,編寫SQL代碼程序的基本原則是儘可能減少數據庫的連接,儘量減少表之間的關聯(在表的設計過程中可以將第三範式的錶轉化成第二範式),少用臨時表,避免將大批量的數據分割成小塊的數據去處理。

此外,建議在表設計過程中儘量避免使用BLOBCLOB等大字段,因爲這樣做可能會對數據庫的遷移備份等造成不必要的麻煩。

 

elvis

2012.12.23

知識共享~共同進步

轉載請註明:

http://blog.csdn.net/elvis_dataguru/article/details/8393933

                                                                                                                                               

                                                                                                                                               

發佈了54 篇原創文章 · 獲贊 42 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章