資料庫 OLAP、OLTP是什麼?相同和不同?適用場景
一、OLTP和OLAP是什麼,二者比較
人類世界遵從基本的物理規律,數據世界裡,關於數據的操作處理,也大體分為OLTP和OLAP兩類。
OLTP on-line transaction processing 聯機事物處理
以傳統RDBMS關係型資料庫為主要應用,用於基本的、日常的事務處理,例如銀行交易
OLAP on-line analytical processing 聯機分析處理
以數據倉庫為主要應用,支援複雜分析、決策支援
|
OLTP | OLAP |
用戶 | 操作人員,低層管理人員 | 決策人員,高級管理人員 |
功能 | 日常操作處理 | 輔助分析決策 |
DB設計 | 面嚮應用 | 面向主題 |
數據 | 當前,細節,最新,二維 | 歷史,聚集,多維,集成,統一 |
存取 | I/O讀寫數十條記錄 | I/O讀上百萬條記錄 |
工作單位 | 簡單的事務 | 複雜的查詢 |
用戶數 | 上千個 | 上百萬個 |
DB大小 | 100MB-GB | 100GB-TB |
時間要求 | 具有實時性 | 對時間的要求不嚴格 |
主要應用 | 傳統關係型資料庫 | 數據倉庫 |
二、OLTP和OLAP系統整體性能評價、系統瓶頸和優化方法
1、OLTP系統整體性能評價
2、OLTP系統瓶頸
OLTP系統最容易出現瓶頸的地方就是CPU與磁碟子系統。
(1)CPU出現瓶頸常表現在邏輯讀總量與計算性函數或者是過程上,邏輯讀總量等於單個語句的邏輯讀乘以執行次數,如果單個語句執行速度雖然很快,但是執行次數非常多,那麼,也可能會導致很大的邏輯讀總量。設計的方法與優化的方法就是減少單個語句的邏輯讀,或者是減少它們的執行次數。另外,一些計算型的函數,如自定義函數、decode等的頻繁使用,也會消耗大量的CPU時間,造成系統的負載升高,正確的設計方法或者是優化方法,需要盡量避免計算過程,如保存計算結果到統計表就是一個好的方法。
(2)磁碟子系統在OLTP環境中,它的承載能力一般取決於它的IOPS處理能力. 因為在OLTP環境中,磁碟物理讀一般都是db file sequential read,也就是單塊讀,但是這個讀的次數非常頻繁。如果頻繁到磁碟子系統都不能承載其IOPS的時候,就會出現大的性能問題。
3、OLTP系統優化方法
OLTP比較常用的設計與優化方式為Cache技術與B-tree索引技術,Cache決定了很多語句不需要從磁碟子系統獲得數據,所以,Web cache與Oracle data buffer對OLTP系統是很重要的。另外,在索引使用方面,語句越簡單越好,這樣執行計劃也穩定,而且一定要使用綁定變數,減少語句解析,盡量減少表關聯,盡量減少分散式事務,基本不使用分區技術、MV技術、並行技術及點陣圖索引。因為並發量很高,批量更新時要分批快速提交,以避免阻塞的發生。
OLTP 系統是一個數據塊變化非常頻繁,SQL 語句提交非常頻繁的系統。 對於數據塊來說,應儘可能讓數據塊保存在記憶體當中,對於SQL來說,儘可能使用變數綁定技術來達到SQL 重用,減少物理I/O 和重複的SQL 解析,從而極大的改善資料庫的性能。
這裡影響性能除了綁定變數,還有可能是熱塊(hot block)。 當一個塊被多個用戶同時讀取時,Oracle 為了維護數據的一致性,需要使用Latch來串列化用戶的操作。當一個用戶獲得了latch後,其他用戶就只能等待,獲取這個數據塊的用戶越多,等待就越明顯。 這就是熱塊的問題。 這種熱快可能是數據塊,也可能是回滾端塊。 對於數據塊來講,通常是資料庫的數據分布不均勻導致,如果是索引的數據塊,可以考慮創建反向所以來達到重新分布數據的目的,對於回滾段數據塊,可以適當多增加幾個回滾段來避免這種爭用。
4、OLAP系統整體性能評價
OLAP,也叫聯機分析處理(Online Analytical Processing)系統,有的時候也叫DSS決策支援系統,就是我們說的數據倉庫。
在這樣的系統中,語句的執行量不是考核標準,因為一條語句的執行時間可能會非常長,讀取的數據也非常多。所以,在這樣的系統中,考核的標準往往是磁碟子系統的吞吐量(頻寬),如能達到多少MB/s的流量。磁碟子系統的吞吐量則往往取決於磁碟的個數,這個時候,Cache基本是沒有效果的,資料庫的讀寫類型基本上是db file scattered read與direct path read/write。應盡量採用個數比較多的磁碟以及比較大的頻寬,如4Gb的光纖介面。
5、OLAP系統的瓶頸和優化方法
對於OLAP系統,SQL 的優化非常重要,因為它的數據量很大,做全表掃描和索引對性能上來說差異是非常大的。在OLAP系統中,常使用分區技術、並行技術。
分區技術在OLAP系統中的重要性主要體現在資料庫管理上,比如資料庫載入,可以通過分區交換的方式實現,備份可以通過備份分區表空間實現,刪除數據可以通過分區進行刪除,至於分區在性能上的影響,它可以使得一些大表的掃描變得很快(只掃描單個分區)。另外,如果分區結合併行的話,也可以使得整個表的掃描會變得很快。總之,分區主要的功能是管理上的方便性,它並不能絕對保證查詢性能的提高,有時候分區會帶來性能上的提高,有時候會降低。
並行技術除了與分區技術結合外,在Oracle 10g中,與RAC結合實現多節點的同時掃描,效果也非常不錯,可把一個任務,如select的全表掃描,平均地分派到多個RAC的節點上去。
在OLAP系統中,不要使用綁定(BIND)變數,因為整個系統的執行量很小,分析時間對於執行時間來說,可以忽略,而且可避免出現錯誤的執行計劃。但是OLAP中可以大量使用點陣圖索引,物化視圖,對於大的事務,盡量尋求速度上的優化,沒有必要像OLTP要求快速提交,甚至要刻意減慢執行的速度。
綁定變數真正的用途是在OLTP系統中,這個系統通常有這樣的特點,用戶並發數很大,用戶的請求十分密集,並且這些請求的SQL 大多數是可以重複使用的。
對於OLAP系統來說,絕大多數時候資料庫上運行著的是報表作業,執行基本上是聚合類的SQL 操作,比如group by,這時候,把優化器模式設置為all_rows是恰當的。 而對於一些分頁操作比較多的網站類資料庫,設置為first_rows會更好一些。 但有時候對於OLAP 系統,我們又有分頁的情況下,我們可以考慮在每條SQL 中用hint。 如:
Select /*+first_rows(10) / a. from table a;
6、分開設計與優化
在設計上要特別注意,如在高可用的OLTP環境中,不要盲目地把OLAP的技術拿過來用。
如分區技術,假設不是大範圍地使用分區關鍵字,而採用其它的欄位作為where條件,那麼,如果是本地索引,將不得不掃描多個索引,而性能變得更為低下。如果是全局索引,又失去分區的意義。
並行技術也是如此,一般在完成大型任務時才使用,如在實際生活中,翻譯一本書,可以先安排多個人,每個人翻譯不同的章節,這樣可以提高翻譯速度。如果只是翻譯一頁書,也去分配不同的人翻譯不同的行,再組合起來,就沒必要了,因為在分配工作的時間裡,一個人或許早就翻譯完了。
點陣圖索引也是一樣,如果用在OLTP環境中,很容易造成阻塞與死鎖。但是,在OLAP環境中,可能會因為其特有的特性,提高OLAP的查詢速度。MV也是基本一樣,包括觸發器等,在DML頻繁的OLTP系統上,很容易成為瓶頸,甚至是Library Cache等待,而在OLAP環境上,則可能會因為使用恰當而提高查詢速度。
對於OLAP系統,在記憶體上可優化的餘地很小,增加CPU 處理速度和磁碟I/O 速度是最直接的提高資料庫性能的方法,當然這也意味著系統成本的增加。
比如我們要對幾億條或者幾十億條數據進行聚合處理,這種海量的數據,全部放在記憶體中操作是很難的,同時也沒有必要,因為這些數據快很少重用,快取起來也沒有實際意義,而且還會造成物理I/O相當大。 所以這種系統的瓶頸往往是磁碟I/O上面的。