天天看點

資料庫必知詞彙:列式存儲

資料庫表的列式存儲(Column-oriented Storage)是優化分析查詢性能方面的一個重要因素,因為它将大大降低總體磁盤 I/O 要求并減少需從磁盤加載的資料量。在典型的關系資料庫表中,每個行均包含一條記錄的字段值。在行式資料庫存儲中,資料塊按順序存儲每個連續列(構成整個行)的值。如果資料塊大小小于記錄的大小,整個記錄的存儲可采用多個資料塊。如果塊大小大于記錄的大小,整個記錄的存儲可能采用 1 個以上的資料塊,進而導緻磁盤空間的使用低效。線上事務處理 (OLTP) 應用程式中,大多數事務涉及頻繁讀取和寫入整個記錄的所有值,通常一次讀取和寫入一條記錄或幾條記錄。最終,行式存儲已針對 OLTP 資料庫進行優化。

使用列式存儲,每個資料塊可為多個行存儲一個列的值。由于每個塊可保留相同類型的資料,是以塊資料可使用專為列資料類型選擇的壓縮方案,進一步減少磁盤空間和 I/O。

磁盤上用于存儲資料的空間節省将繼續存在,以便檢索資料并将其存儲在記憶體中。由于許多資料庫操作一次隻需通路或操作一個或幾個列,您可通過僅檢索查詢實際所需的列的資料塊來節省記憶體空間。其中,OLTP 事務通常涉及少量記錄的一個行中的大多數列或所有列,資料倉庫查詢通常僅讀取大量行的幾個列。這意味着,讀取相同數目的行的相同數目的列字段值需要一小部分 I/O 操作并使用處理行式塊所需的記憶體的一部分。實際上,通過使用具有大量列和行的表,可大幅提高效率。例如,假定一個表包含 100 個列。使用 5 個列的查詢僅需讀取表中 5% 的資料。對于大型資料庫,可為數十億或甚至數萬億記錄實作此節省。相反,一個行式資料庫将讀取包含 95 個不需要的列的資料塊。

列式存儲的優點如下:

  • 極高的裝載速度(最高可以等于所有硬碟IO 的總和,基本是極限了)
  • 适合大量的資料而不是小資料
  • 實時加載資料僅限于增加(删除和更新需要解壓縮Block 然後計算然後重新壓縮儲存)
  • 高效的壓縮率,不僅節省儲存空間也節省計算記憶體和CPU。
  • 非常适合做聚合操作。

列式存儲的缺點如下:

  • 不适合掃描小量資料
  • 不适合随機的更新
  • 批量更新情況各異,有的優化的比較好的列式資料庫(比如Vertica)表現比較好,有些沒有針對更新的資料庫表現比較差。
  • 不适合做含有删除和更新的實時操作。

資料來源:

列式存儲

https://docs.amazonaws.cn/redshift/latest/dg/c_columnar_storage_disk_mem_mgmnt.html

處理海量資料:列式存儲綜述(存儲篇)

https://zhuanlan.zhihu.com/p/35622907

淺析列式資料庫的特點

https://searchdatabase.techtarget.com.cn/7-20958/