oracle資料庫應用開發經驗

2022-05-04 23:45:10 字數 3631 閱讀 9840

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

alter table nologging

刪除索引

使用交換分割槽

l  最好對資料庫api進行封裝,以便在日誌裡面輸出使用的sql

系統做複雜後,新手想完全了解系統業務很困難。如果可以設定在日誌裡面輸出訪問資料庫使用的sql,可以更方便我們進行系統運維。

《oracle資料庫應用效能優化經驗(培訓講義)》

《oracle proc程式設計效能優化經驗》

Oracle資料庫應用

01.表空間 我們知道oarcle資料庫真正存放資料的是資料檔案 data files oarcle表空間 tablespaces 實際上是乙個邏輯的概念,他在物理上是並不存在的,那麼把一組data files 捻在一起就成為乙個表空間。使用該create tablespace語句建立乙個表空間,該...

資料庫設計經驗之 應用程式開發

1 快取資料庫配置 列舉定義表資訊,減少對資料庫的訪問。2 使用連線池,並且控制最大連線數。3 資料庫訪問都通過儲存過程實現,盡量不要直接操作表。4 如果乙個業務多次呼叫不同的儲存過程,可以考慮合併在乙個儲存過程中,減少資料庫訪問。5 合併業務請求,同型別請求合併成乙個大請求,提交給資料庫。6 應用...

oracle資料庫的應用

oracle資料庫包含邏輯結構和物理結構.資料庫的物理結構是指構成資料庫的一組作業系統檔案.資料庫的邏輯結構是指描述資料組織方式的一組邏概念及他們之間的關係.表空間有乙個或者多個資料檔案組成 1.1表空間的分類 類別說明 永久性表空間 一般儲存表 檢視 過程和索引等資料.system sysaux ...