直欄式儲存Column-oriented DBMS)是以欄相關儲存架構進行資料儲存的資料庫,主要適合於批次資料處理和即時查詢。相對應的是列式儲存,資料以列相關的儲存體系架構進行空間分配,主要適合於小批次的資料處理,常用於連線事務型資料處理。

描述 編輯

資料庫以列、欄的二維表的形式儲存資料,但是卻以一維字串的方式儲存,如下表:

RowId EmpId Lastname Firstname Salary
001 10 Smith Joe 40000
002 12 Jones Mary 50000
003 11 Johnson Cathy 44000
004 22 Jones Bob 55000

這個簡單的表包括員工編號(EmpId)、姓名欄位(Lastname and Firstname)及工資(Salary).

這個表儲存在電腦的主記憶體(RAM)和儲存(硬碟)中。雖然主記憶體和硬碟在機制上不同,電腦的作業系統是以同樣的方式儲存的。資料庫必須把這個二維表儲存在一系列一維的「位元組」中,由作業系統寫到主記憶體或硬碟中。

直欄式儲存把一欄中的資料值串在一起儲存起來,然後再儲存下一欄的資料,以此類推。

10:001,12:002,11:003,22:004;
Smith:001,Jones:002,Johnson:003,Jones:004;
Joe:001,Mary:002,Cathy:003,Bob:004;
40000:001,50000:002,44000:003,55000:004; 

列式儲存把一列中的資料值串在一起儲存起來,然後再儲存下一列的資料,以此類推。

001:10,Smith,Joe,40000;
002:12,Jones,Mary,50000;
003:11,Johnson,Cathy,44000;
004:22,Jones,Bob,55000;

這只是一個簡化的說法。此外,劃分英語Partition (database), 索引, 快取機制, 視圖, OLAP立方英語OLAP cube, 以及諸如 預寫式紀錄檔多版本並行控制 此類的事務系統都在現實的應用環境中發揮作用。一般來說, 側重於連線事務處理 (OLTP) 的系統更適用列式儲存, 而側重於連線分析處理 的系統就必須在列式儲存和直欄式儲存中找到適當得平衡。

特點 編輯

因為硬碟定址時間相較於電腦上其他部件的執行速度來說不是一般的慢,所以常用相同工作負載下的硬碟訪問效能來比較列式儲存和直欄式儲存。通常,順序讀取資料要比隨機訪問更快[1]。而且,硬碟定址時間的提升比起CPU速度的進步要慢得多 (參看 摩爾定律),在使用硬碟作為儲存媒介的系統上這種情況很可能還會持續一段時間。下面簡單羅列了一些選擇列式儲存還是直欄式儲存的權衡依據。當然,如果能夠把資料全放在主記憶體中,那麼使用主記憶體資料庫效能會更好。

  1. 在只需要根據某幾行來聚合資料的時候,按行的資料組織方式更有效。因為這樣只需要讀取一部分資料,要比讀取全部資料更快。
  2. 當只需要修改某一行值的時候,按行的資料組織方式更有效。因為可以直接找到某行資料並修改,而與列中的其他行無關。
  3. 當需要某列的多行資料的時候,按列的資料組織方式更有效。當列中資料不是太多的情況下一次硬碟定址就可以獲得該列的所有資料。
  4. 在新增列資料的時候,如果各行都有值,那麼按列的資料組織方式會更有效,因為只需要一次硬碟定址就可以寫入整列的全部資料。

在實際應用中,面向列的資料儲存架構,更適用於OLTP-頻繁互動事務的場景。面向行的資料儲存架構,更適用於OLAP-(如資料倉儲)這樣在海量資料(可能達到 terabyte規模)中進行有限複雜查詢的場景。

實現 編輯

自由和開源軟體 編輯

資料庫名字 實現語言 注釋
Apache Druid英語Apache Druid Java 開始於2011年,用於低延遲大規模的攝取和查詢。可從Imply Data英語Imply Data獲得的支援和擴充。
Apache Kudu英語Apache Kudu C++ 發行於2016年,用以使Apache Hadoop生態系統完全。
Apache Pinot英語Apache Pinot Java 開源於2015年,用於即時低延遲分析。可從StarTree獲得支援和擴充。
Calpont InfiniDB英語InfiniDB C++
ClickHouse C++ 發行於2016年,用於分析即時更新的資料。
CrateDB英語CrateDB Java
C-Store英語C-Store
DuckDB C++ 可嵌入的、行程內、面向列的SQL OLAP RDBMS。
Databend Rust 可伸縮和可靠的Serverless Data Warehouse。
InfluxDB Go 時間序列資料庫英語Time series database
Greenplum英語Greenplum資料庫 C 可從VMware獲得支援和擴充。
MapD英語HEAVY.AI C++
MariaDB ColumnStore C & C++ 曾經的Calpont InfiniDB英語InfiniDB
Metakit英語Metakit C++
MonetDB英語MonetDB C 開源(自從2004年)列式關係DBMS先驅。
PostgreSQL cstore fdw[2] vops[3] C cstore_fdw使用ORC英語Apache ORC格式。
StarRocks Java & C++ 開源、統一的分析平台,用於批次和即時分析。可從CelerData獲得支援和擴充。

平台即服務(PaaS) 編輯

專有軟體 編輯

專有的直欄式儲存的代表包括:kdb+SAP HANASybase IQ英語SAP IQSAND CDBMS英語SAND CDBMSAster Data Systems英語Aster Data Systems等。

參見 編輯

參照 編輯

  1. ^ The Star Schema Benchmark and Augmented Fact Table Indexing頁面存檔備份,存於網際網路檔案館), Pat & Betty O』Neil, Xuedong Chen and Stephen Revilak, TPC Technology Conference 8/24/09
  2. ^ Columnar store for analytics with PostgreSQL. [2023-01-19]. (原始內容存檔於2023-01-19). 
  3. ^ Vectorized Operations extension for PostgreSQL. [2023-01-19]. (原始內容存檔於2023-01-19).