列式資料庫
資料庫(Database)是按照數據結構來組織、存儲和管理數據的建立在計算機存儲設備上的倉庫。簡單來說是本身可視為電子化的檔案櫃——存儲電子檔案的處所,用戶可以對檔案中的數據進行新增、截取、更新、刪除等操作。
列式資料庫是以列相關存儲架構進行數據存儲的資料庫,主要適合於批量數據處理和即時查詢。相對應的是行式資料庫,數據以行相關的存儲體系架構進行空間分配,主要適合於小批量的數據處理,常用於在線上事務型數據處理。因為硬碟定址時間相較於計算機上其他部件的運行速度來說慢的不是一般,所以常用相同工作負載下的硬碟訪問性能來比較行資料庫和列資料庫。順序讀取數據要比隨機訪問更快。硬碟定址時間的提升比起CPU速度的進步要慢得多 ,在使用硬碟作為存儲媒介的系統上這種情況很可能還會持續一段時間。下面簡單羅列了一些選擇行資料庫還是列資料庫的權衡依據。如果能夠把數據全放在記憶體中,那么使用記憶體資料庫性能會更好。在只需要根據某幾列來聚合數據的時候按列的數據組織方式更有效。因為這樣只需要讀取一部分數據,要比讀取全部數據更快。當只需要修改某一列值的時候按列的數據組織方式更有效。因為可以直接找到某列數據並修改,而與行中的其他列無關。當需要某行的多列數據的時候按行的數據組織方式更有效。當行中數據不是太多的情況下一次硬碟定址就可以獲得該行的所有數據。在新增行數據的時候,如果各列都有值,那么按行的數據組織方式會更有效,因為只需要一次硬碟定址就可以寫入整行的全部數據。在實際套用中,面向行的數據存儲架構更適用於OLTP-頻繁互動事務的場景。面向列的數據存儲架構更適用於OLAP-(如數據倉庫)這樣在數據((可能達到 terabyte規模))中進行有限複雜查詢的場景。列式資料庫在數據分析、 存儲、 BI (商業智慧型) 這3 個領域有著顯著的優勢, 這是傳統行式資料庫所不擅長的,列式資料庫甚至能解決行式資料庫無法想像的問題。1996~2009年間 Sybase 公司推出的產品中 Sybase iq逐漸成為了列式存儲的獨立產品。並在其中添加了對BLOB、CLOB、WEB services、XML 的支持;增加了OLAP函式、最佳化了子查詢的性能,使得整個資料庫的查詢分析能力得到了大幅提高, 同時提高了數據載入速度; 增加了並發查詢架構,使其適應了多核技術,同時通過信息生命周期管理技術提高了數據的管理效率加強了數據管理、監控、分析等圖形工具支持。
行式存儲資料庫
在傳統行式資料庫中,數據是按行來存儲的,每一行數據包含不同類型的數據,反映到存儲結構中,即先存儲完一行數據,置一個行標記再存儲下一行數據而列式資料庫是通過列來存儲的,每一列的數據具有相同的數據類型,體現為存儲結構中是先存儲好一列數據,再進行下一列數據的存儲。在存儲結構上,行式存儲資料庫中的數據是以數據檔案的形式存儲的;數據檔案的基本單位是塊和頁;數據塊內的結構分為塊頭與數據區;索引與數據檔案是分離的。傳統行式資料庫的存儲結構決定了它有如下的特點:方便進行數據的插入與更新操作;沒有索引的查詢將會使用大量的I/O;建立索引和物化視圖需要花費大量時間和資源;面對查詢的需求,資料庫必須被大量膨脹才能滿足性能要求 。
優缺點
列存儲資料庫與行存儲數據的本質區別在於存儲結構的不同,在行存儲資料庫中,數據是以記錄或行為單位進行存儲的,而在列存儲資料庫中,同一個列的值被存放在同一個存儲單元中。正是由於這個差別,當列式資料庫與行式資料庫相比較時,列式資料庫系統中的列由於是分開存儲的,它的數據相對獨立,進行數據存儲或壓縮等操作的時候也相對獨立,不會影響到其它列。具體來說,列式資料庫具有如下優勢當我們執行一個SQL語句時,它可以將SQL語句分解為若干個可獨立執行的、基於列的原子操作,列式資料庫只需將涉及到的列讀入記憶體或高速快取即可,大大節省了頻寬。列式資料庫執行引擎在訪問數據時是以列為基本單位的,這不同於行式資料庫對記錄進行按順序的逐條訪問。列資料庫對屬性值的訪問有順序訪問、跳躍訪問和隨機訪問種方式。由於數據都以列的形式存儲,所以在語句執行過程中,節省了行資料庫中映射運算的開銷。同一個存儲單元中的數據具有相同的數據類型,這些數據所有相同的特徵,可以進行高效的壓縮操作。由於在列式資料庫中可以進行輕量級的壓縮,即可以在不解壓的情況下直接對壓縮態的數據進行操作,它的查詢效率高於行式資料庫。列存儲資料庫系統也存在以下缺點:增加了磁碟定址的時間。當並行讀取多列時,需要從磁碟讀取多個數據塊的數據,這種代價可以通過增加預取數據的磁碟空間得到降低。增加了插入數據所用的開銷。在列資料庫中要進行插入操作,需要尋找每個屬性列的位置,其執行效率非常低,這種開銷可以通過批量進行插入數據來予以降低。
增加了元組重構的代價。為了給列資料庫提供一個標準的通用關係資料庫接口,如ODBCJDBC等,必須在查詢計畫中將不同屬性列重組成元組,雖然該操作可以在記憶體中進行,但是執行該操作所花費的CPU代價非常高。在通常情況下,可以採用延時物化技術降低該操作的代價。