l 日志表應該以時間做磁區,方便清理
一般應用都會有一些表用來記錄用戶操作日志,資料變更記錄,交易流水等日志型的庫表,這些表最好按時間欄位做磁區,這樣在遷移或者清理歷史記錄時會比較方便,借助oracle的磁區交換清理特性,效率比delete高很多,
l 頻繁訪問的sequece應該增加cache
Oracle在創建序列可以指定cache引數,如果打開這個引數,Oracle就可以預先生成一些sequece,這樣應用獲取sequece相互爭用資料塊的概率就會減少,加快獲取sequece速度,
l 隊串列也應該做磁區,減少出現高水位問題
有時我們會使用資料庫表存放待處理的資訊,處理完后把記錄洗掉,像是訊息佇列一樣,這種我們稱之為隊串列,這種表經常會出現高水位的問題,即某一瞬間突然涌入了很多資料,等系統把表里面記錄處理完,洗掉后整個表訪問速度還是很慢(因為高水位被上移后沒恢復),這時如果庫表有磁區,則不容易出現這種問題,
l 減少外鍵使用
在設計庫表時我們一般要使用外鍵以輔助表示不同庫表資料的關聯,但在實際部署時最好不要把外鍵加上,一個原因是外鍵會影響資料插入洗掉效率,更重要的原因是加了外鍵的庫表在資料清理,修復時會帶來許多麻煩,
l 減少存盤程序
有些程式員喜歡使用存盤程序封裝業務邏輯,雖然這樣處理資料速度快,但把壓力都留給了資料庫服務器,而資料庫服務器資源往往是比較有限的,而且比較難擴展,而應用服務器資源相對會豐富一些,也好擴展,所以建議盡量少使用存盤程序,即使用也不要放太多業務邏輯,
l 使用系結變數
盡可能使用系結變數代替拼sql,這樣一是減少sql注入風險,另外一個是讓資料庫可以復用執行計劃(sql文本相同的才有可能復用),減少資料庫生成執行計劃的消耗,
l 使用并行
Oracle提供并行技術,可以把一個sql涉及的資料集拆分成多份,交由不同行程處理,以加快資料處理速度,對于OLAP系統,可以考慮使用此技巧提高sql運行速度,
l 使用hint避免資料量變化過大的表
有時候我們的應用會出現一些資料變化比較大的表,有時表里面只有幾十條資料,有時可能有幾萬,幾十萬條,對于這種表的訪問最好使用hint強制資料庫在任何情況都使用索引訪問,因為在資料量小時資料庫生成的執行計劃可能是使用全表掃描,到后面資料發生變化時由于sql沒有變,執行計劃也沒變,這時使用全表掃描效率就會很低,
l 使用tt 共享記憶體等
當一個會話需要訪問一個資料塊,而這個資料塊正在被另一個用戶從磁盤讀取到記憶體中或者這個資料塊正在被另一個會話修改時,當前的會話就需要等待,就會產生一個buffer busy waits等待,也伴隨著Latch爭用,如果太多的會話去訪問相同的資料塊導致長時間的buffer busy waits等待,通常表現形式為CPU使用率很高,但吞吐量很低,造成熱快的原因可能是資料庫設定導致或者重復執行的SQL 頻繁訪問一些相同的資料塊導致,
l 兩個大表關聯查詢盡量走hash join
雖然oracle提供了很多種表關聯演算法,但是經過實驗,對兩個資料量大的表連接還是使用hash連接效率最高,
l 盡量少用業務要素作為主鍵
不使用業務要素作為主鍵,可以為系統提供很多便利性,一是避免需求變更,原來,二是
l 合理使用縱表和橫表設計
所謂橫表就是指把一個物體的所有特性存盤在一行記錄,形成(ID,屬性1,屬性2,,,,,屬性N)的庫表,
而縱表則是把物體屬性分開多條記錄存盤,設計成(ID,屬性名稱,屬性值)這樣的庫表,
下面是一個橫表和縱表的例子:

使用橫表好處:
1 比較直觀,查詢比較方便
2 屬性值可以根據屬性內容設計,例如年齡用number型別存盤,職業用varchar2存盤
使用縱表好處:
1 避免單表欄位不停擴展,oracle是行存盤資料庫,記錄欄位越多,記錄掃描時消耗的IO就會更多
2 增加屬性比較方便
建議:對于頻繁使用的屬性放橫表,對于不頻繁使用的屬性(例如住址),或者只有少部分記錄有的屬性(例如博客)放縱表,
l 頻繁使用的小表可以考慮設定cache引數
設定了cache后,oracle會盡量讓這個表的資料保持在記憶體,提高訪問速度,我碰到過把操作員和選單資訊表加了cache引數,大幅提高登錄速度的情況,
l 物化視圖
普通視圖只是用于簡化復雜查詢,對于效率提升不大,Oracle提供了一種叫物化視圖的特殊物件,可以把視圖查詢的結果集存起來,并且支持在基礎資料變化時自動重繪,不過物化視圖bug多,使用需要謹慎,
l 使用rac集群的資料庫,最好分業務使用不同優先節點
由于oracle訪問資料塊時要求先把資料裝載到記憶體,如果有某個資料塊頻繁被不同實體節點訪問,會導致rac集群頻繁地把資料從一個節點機器傳輸到另一個節點,這樣會很消耗時間,所以建議不同業務優先訪問不同rac節點,這樣可以減少資料爭搶的概率,
l 善用函式索引解決狀態欄位查詢,少用位圖索引
使用,位圖索引容易造成資料塊爭用,建議在OLTP系統少用,
l 悲觀鎖和樂觀鎖
悲觀鎖思想認為,資料被并發修改的幾率比較大,需要在修改之前借助于資料庫鎖機制,先對資料進行加鎖,樂觀鎖思想認為,資料一般是不會造成沖突的,所以在一般先將資料查出來但不加鎖,在修改回資料庫時檢查資料有沒有發生過變化,如果有則認為更新失敗,業務場景允許失敗重試的情況,建議多考慮使用悲觀鎖,減少鎖資源對資料庫的消耗,
l 一致讀
Oracle的資料塊被修改之前會把資料塊備份到undo表空間,這樣可以保證sql查詢程序中,資料被修改不會影響查詢結果,而且還可以使用“閃回查詢”的技術,指定查詢庫表某個時間點的資料,
l 使用with as改寫復雜的關聯查詢
這樣好處一是簡化sql邏輯,二是有必要時還可以使用hint:materialize先把with as的內容物體化,減少重復查詢,
l 索引要合理(基數過小的欄位不適合建索引)
有些程式員在性別列上面都建了索引,以為查詢時至少可以省一半時間,其實是錯的,因為對于這種選擇性不高的查詢,先使用索引查詢再回表查會導致很多隨機讀寫,速度反而不如直接全表掃描快,
l 大量資料遷移時加快入庫速度的方法:
commit nowait
append
alter table nologging
洗掉索引
使用交換磁區
l 最好對資料庫api進行封裝,以便在日志里面輸出使用的sql
系統做復雜后,新手想完全了解系統業務很困難,如果可以設定在日志里面輸出訪問資料庫使用的sql,可以更方便我們進行系統運維,
更多資料庫開發經驗見:
https://www.cnblogs.com/kingstarer/p/9613626.html 《oracle資料庫應用性能優化經驗(培訓講義)》
https://www.cnblogs.com/kingstarer/p/11968247.html 《Oracle Proc編程性能優化經驗》
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/21727.html
標籤:Oracle
下一篇:Oracle 11g靜默安裝
