直欄式儲存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).