Storage Models & Compression
Database Workloads
資料庫可以依據查詢複雜度以及讀寫比例來進行分類 :
- OLTP (Online Transaction Processing) : 一些簡單的讀寫操作,且通常只包含一小部分的資料
- OLAP (Online Analytical Processing) : 一些複雜的查詢,且有大量的資料聚合
- HTAP (Hybrid Transaction/Analytical Processing) : 同時支持 OLTP 和 OLAP
Storage Models
relational model 並沒有強調同一個 tuple 的所有屬性都要被儲存在同一個 page 中,在不同的應用場景下,我們可以有不一樣的做法。
常見的儲存模型有以下幾種 :
- N-ary Storage Model (NSM) (row store)
- Decomposition Storage Model (DSM) (column store)
- Hybrid Storage Model (PAX)
N-ary Storage Model (NSM)
如同我們之前所學的一樣,NSM 會將一個 tuple 的屬性在 page 中連續儲存,這種儲存方式較為適合 OLTP 的應用場景。
如圖所示,一般的 OLTP 應用場景中,我們會有大量的查詢,我們可以直接透過 index 之後返還所有資料。
但對於 OLAP 應用場景,即使我們只需要一個 tuple 的部分屬性,我們也需要讀取整個 page。
總結來說,NSM 的優缺點如下 :
- 優點
- 快速的 insert、update、delete
- 適合需要所有屬性的查詢
- 適合使用 index 的查詢
- 缺點
- 不適合需要 table 中大量 tuple 或是一部分屬性的查詢
- 記憶體使用效率較低 (需要讀取整個 page)
- 不適合進行壓縮
Decomposition Storage Model (DSM)
DSM 會將所有 tuple 的同一個屬性儲存在一起,這種儲存方式較為適合 OLAP 的應用場景。
透過這種方式,我們就可以減少不必要的 I/O,只讀取我們 需要的部分屬性,但這樣也會造成新的問題,例如要如何存取同一個 tuple 的不同屬性,通常這個問題有兩種解決方式 :
- Fixed-length Offsets : 每個屬性都是固定長度,透過 offset 來存取 (常見)
- Embedded Tuple Ids : 在每個屬性前都加上 tuple id,透過 tuple id 來存取
對 fixed-length offsets 來說,padding 會造成空間浪費, 因此我們可以考慮使用 dictionary compression。
總結來說,DSM 的優缺點如下 :
- 優點
- 減少 OLAP 查詢的 I/O
- 記憶體使用效率較高
- 適合進行壓縮
- 缺點
- insert、update、delete 較慢
Partition Attributes Across (PAX)
PAX 是一種混合式的儲存模型,目標是將 column store 的優點 (處理速度) 和 row store 的優點 (空間) 結合在一起。
這種儲存方式會先將 tuple 分成幾個 group,在每個 group 中,資料會以 column store 的方式儲存,同時在 global header 中儲存每個 tuple 的 offset,且每個 group 也都有自己的 header 來儲存 metadata。