列式資料庫
此條目需要補充更多來源。 (2019年12月5日) |
直欄式儲存(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;
這只是一個簡化的說法。此外,劃分、索引、快取機制、視圖、OLAP立方,以及諸如預寫式紀錄檔和多版本並行控制此類的事務系統,都在現實的應用環境中發揮作用。一般來說,側重於連線事務處理 (OLTP) 的系統更適用列式儲存,而側重於連線分析處理的系統就必須在列式儲存和直欄式儲存中找到適當得平衡。
特點
[編輯]因為硬碟定址時間相較於電腦上其他部件的執行速度來說不是一般的慢,所以常用相同工作負載下的硬碟訪問效能來比較列式儲存和直欄式儲存。通常,順序讀取數據要比隨機訪問更快[1]。而且,硬碟定址時間的提升比起CPU速度的進步要慢得多 (參看 摩爾定律),在使用硬碟作為儲存媒介的系統上這種情況很可能還會持續一段時間。下面簡單羅列了一些選擇列式儲存還是直欄式儲存的權衡依據。當然,如果能夠把數據全放在主記憶體中,那麼使用主記憶體資料庫效能會更好。
- 在只需要根據某幾行來聚合數據的時候,按行的數據組織方式更有效。因為這樣只需要讀取一部分數據,要比讀取全部數據更快。
- 當只需要修改某一行值的時候,按行的數據組織方式更有效。因為可以直接找到某行數據並修改,而與列中的其他行無關。
- 當需要某列的多行數據的時候,按列的數據組織方式更有效。當列中數據不是太多的情況下一次硬碟定址就可以獲得該列的所有數據。
- 在新增列數據的時候,如果各行都有值,那麼按列的數據組織方式會更有效,因為只需要一次硬碟定址就可以寫入整列的全部數據。
在實際應用中,面向列的數據儲存架構,更適用於OLTP-頻繁互動事務的場景。面向行的數據儲存架構,更適用於OLAP-(如數據倉庫)這樣在海量數據(可能達到 terabyte規模)中進行有限複雜查詢的場景。
實現
[編輯]自由和開源軟件
[編輯]資料庫名字 | 實現語言 | 註釋 |
---|---|---|
Apache Druid | Java | 開始於2011年,用於低延遲大規模的攝取和查詢。可從Imply Data獲得的支援和擴充。 |
Apache Kudu | C++ | 發行於2016年,用以使Apache Hadoop生態系統完全。 |
Apache Pinot | Java | 開源於2015年,用於即時低延遲分析。可從StarTree獲得支援和擴充。 |
Calpont InfiniDB | C++ | |
ClickHouse | C++ | 發行於2016年,用於分析即時更新的數據。 |
CrateDB | Java | |
C-Store | ||
DuckDB | C++ | 可嵌入的、行程內、面向列的SQL OLAP RDBMS。 |
Databend | Rust | 可伸縮和可靠的Serverless Data Warehouse。 |
InfluxDB | Go | 時間序列資料庫 |
Greenplum資料庫 | C | 可從VMware獲得支援和擴充。 |
MapD | C++ | |
MariaDB ColumnStore | C & C++ | 曾經的Calpont InfiniDB。 |
Metakit | C++ | |
MonetDB | C | 開源(自從2004年)列式關係DBMS先驅。 |
PostgreSQL cstore fdw[2] vops[3] | C | cstore_fdw使用ORC格式。 |
StarRocks | Java & C++ | 開源、統一的分析平台,用於批次和即時分析。可從CelerData獲得支援和擴充。 |
平台即服務(PaaS)
[編輯]- Amazon Redshift
- Microsoft Azure SQL Data Warehouse
- Google BigQuery
- Oracle Autonomous Datawarehouse Cloud Service
- Snowflake Computing
- MariaDB SkySQL
- Actian Avalanche
- Vertica Accelerator
- CelerData
專有軟件
[編輯]專有的直欄式儲存的代表包括:kdb+、SAP HANA、Sybase IQ、SAND CDBMS、Aster Data Systems等。
參見
[編輯]參照
[編輯]- ^ The Star Schema Benchmark and Augmented Fact Table Indexing (頁面存檔備份,存於互聯網檔案館), Pat & Betty O』Neil, Xuedong Chen and Stephen Revilak, TPC Technology Conference 8/24/09
- ^ Columnar store for analytics with PostgreSQL. [2023-01-19]. (原始內容存檔於2023-01-19).
- ^ Vectorized Operations extension for PostgreSQL. [2023-01-19]. (原始內容存檔於2023-01-19).