深入探索列式數(shù)據(jù)庫:是什么讓它們脫穎而出
如果您是一名數(shù)據(jù)從業(yè)者,了解這些內(nèi)部原理可以幫助您優(yōu)化性能。
譯自Deep Dive into Columnar Databases: What Makes Them Shine,作者 Gaurav Ramesh。
列式存儲(chǔ)已成為數(shù)據(jù)工程和分析領(lǐng)域的一個(gè)顛覆者。與傳統(tǒng)的行式數(shù)據(jù)庫相比,它提供了顯著的性能優(yōu)勢(shì)。
以列存儲(chǔ)數(shù)據(jù)的想法并不新鮮。它最早由 GP Copeland 和 SN Khoshafian 在 1985 年全面提出。他們的論文“A Decomposition Storage Model (DSM),”提出以二元關(guān)系存儲(chǔ)數(shù)據(jù),將每個(gè)屬性值與記錄的標(biāo)識(shí)符配對(duì)。這種方法按列而不是按行組織數(shù)據(jù),為涉及屬性子集的查詢提供了簡單性和檢索性能優(yōu)勢(shì)。但是,它總體上需要更多的存儲(chǔ)空間。
研究人員于1999 年開始開發(fā) MonetDB,并于 2004 年將其作為開源項(xiàng)目發(fā)布。它成為首批采用列式架構(gòu)進(jìn)行分析工作負(fù)載并展示其有效性的系統(tǒng)之一。在 2000 年代中期開發(fā)的C-Store標(biāo)志著另一個(gè)重要的里程碑。它引入了先進(jìn)的概念,這些概念現(xiàn)在已成為現(xiàn)代列式存儲(chǔ)系統(tǒng)中的標(biāo)準(zhǔn)。
在 2000 年代后期和 2010 年代初期,該領(lǐng)域的發(fā)展加速,Apache Parquet等項(xiàng)目(受Google 的 Dremel 論文的影響)將列式存儲(chǔ)引入了 Hadoop 生態(tài)系統(tǒng)。
核心概念:列式存儲(chǔ)與行式存儲(chǔ)
傳統(tǒng)的行式數(shù)據(jù)庫將單個(gè)行的所有數(shù)據(jù)存儲(chǔ)在一起。一行表示您要建模的實(shí)體。從這個(gè)角度來看,對(duì)于這篇文章,可以將面向文檔的數(shù)據(jù)庫(如 MongoDB)視為行式數(shù)據(jù)庫,因?yàn)樗鼘⒄麄€(gè)文檔(實(shí)體)存儲(chǔ)在一起,類似于行式數(shù)據(jù)庫。相比之下,列式數(shù)據(jù)存儲(chǔ)將數(shù)據(jù)組織成列,每列包含所有行中單個(gè)屬性的值。這種看似簡單的更改對(duì)性能產(chǎn)生了深遠(yuǎn)的影響。
查詢處理中的謂詞和投影
在討論事務(wù)和分析系統(tǒng)時(shí),需要理解兩個(gè)關(guān)鍵概念:
- 謂詞是您用來過濾所需實(shí)體(行)的條件(將它們視為 SQL 查詢中的WHERE子句)。
- 投影是您在響應(yīng)中需要的字段(列)(將它們視為在SELECT語句中定義的名稱)。
如果您將數(shù)據(jù)視為垂直堆疊的行列表,則謂詞會(huì)水平切片,而投影會(huì)垂直切片。
事務(wù)查詢通常依賴于謂詞來過濾行,投影跨越整行(例如,SELECT * FROM orders WHERE user_id = 1234)。相比之下,分析查詢中的投影涉及被查詢實(shí)體的一小部分字段(例如,SELECT user_id, name, num_orders FROM user_aggregates WHERE user_id = 1234)。
考慮一個(gè)包含 50 列和數(shù)百萬行的表。在行式系統(tǒng)中,如果您只需要三列,數(shù)據(jù)庫仍然必須讀取每行的所有 50 列。使用列式存儲(chǔ),僅訪問三個(gè)相關(guān)的列,從而大大減少了 I/O 開銷,即在分析中處理的數(shù)據(jù)量查詢。
支持列式存儲(chǔ)的關(guān)鍵技術(shù)
以列存儲(chǔ)數(shù)據(jù)可以實(shí)現(xiàn)各種優(yōu)化,從而顯著提高查詢性能。這是一個(gè)思維模型:將查詢執(zhí)行視為一個(gè)通過各個(gè)階段傳遞數(shù)據(jù)的管道,并在每個(gè)步驟中對(duì)其進(jìn)行轉(zhuǎn)換。數(shù)據(jù)越小,成本越低,管道速度越快。
減少數(shù)據(jù)您可以使用多種方法:
- 高效的數(shù)據(jù)表示(數(shù)據(jù)壓縮,列式壓縮)
- 提前過濾數(shù)據(jù)(列裁剪,謂詞下推)
- 盡可能晚地?cái)U(kuò)展數(shù)據(jù)(直接對(duì)壓縮數(shù)據(jù)進(jìn)行操作,延遲物化)
- 更快的數(shù)據(jù)處理(向量化執(zhí)行,優(yōu)化連接)
這些技術(shù)是相互關(guān)聯(lián)的,并且相互依賴以獲得最大的性能提升。
數(shù)據(jù)壓縮和列式壓縮
列式存儲(chǔ)實(shí)現(xiàn)了高壓縮率,因?yàn)閱蝹€(gè)列中的數(shù)據(jù)類型相同并且表現(xiàn)出相似的模式。諸如字典編碼、運(yùn)行長度編碼 (RLE)、位打包和增量編碼等技術(shù)通常用于現(xiàn)代列式存儲(chǔ)中。
例如,在跟蹤用戶流量來源的 Web 分析數(shù)據(jù)庫中,source列通常具有一小組唯一值。 這允許:
- 字典編碼:將整數(shù)值分配給字符串值(例如,email = 1,Twitter = 2)。
- 運(yùn)行長度編碼 (RLE):如果連續(xù)條目具有相同的值,則將其存儲(chǔ)為(值,計(jì)數(shù))。
- 位打包:如果只存在幾個(gè)唯一值,則每個(gè)值使用較少的位而不是完整的整數(shù)。
列裁剪
列裁剪消除了查詢執(zhí)行中不必要的列。 考慮以下查詢:
SELECT first_name, last_name, email, phone FROM users WHERE num_orders > 10
如果表有 100 列,但查詢只需要 5 列,則列裁剪可將 I/O 開銷降低 95%。
謂詞下推
謂詞下推在查詢執(zhí)行管道中盡早地過濾數(shù)據(jù)。 通過使用區(qū)域圖(跟蹤存儲(chǔ)塊內(nèi)最小值/最大值的元數(shù)據(jù)),數(shù)據(jù)庫可以跳過不符合過濾條件的整個(gè)塊。
例如,在查詢中:
SELECT name FROM users WHERE age > 30 AND city = 'New York'
列式數(shù)據(jù)庫可以首先根據(jù)元數(shù)據(jù)過濾塊,然后再掃描單個(gè)行,從而減少不必要的處理。
直接對(duì)壓縮數(shù)據(jù)進(jìn)行操作
列式數(shù)據(jù)庫可以直接對(duì)壓縮數(shù)據(jù)執(zhí)行操作,從而最大限度地降低 I/O 成本。 考慮以下查詢:
SELECT sum(salary) FROM employees WHERE department = 1002
使用字典編碼和 RLE,只有相關(guān)數(shù)據(jù)在最后一步被讀取和擴(kuò)展,從而顯著提高性能。
延遲物化
延遲物化會(huì)延遲加載不必要的列,直到需要時(shí)才加載。 在查詢中:
SELECT name FROM users WHERE age > 30 AND city = 'New York'
最初只處理 age 和 city,name 列在最后階段加載。
向量化處理
SIMD(單指令多數(shù)據(jù))允許處理器并行地對(duì)多個(gè)值執(zhí)行操作。 考慮:
SELECT sum(price) FROM sales WHERE user_id = 1234
SIMD 不是逐行評(píng)估 user_id,而是一次比較 256 個(gè)值,從而顯著提高速度。
高效的連接實(shí)現(xiàn)
列式數(shù)據(jù)庫實(shí)現(xiàn)了高級(jí)連接技術(shù),例如使用 Bloom 過濾器的半連接。 這些結(jié)構(gòu)允許數(shù)據(jù)庫有效地檢查數(shù)據(jù)集中是否存在某個(gè)值,從而減少不必要的比較。
例如,在連接中:
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.region = 'EMEA'
為有效客戶構(gòu)建 Bloom 過濾器,允許數(shù)據(jù)庫快速丟棄不相關(guān)的訂單。
結(jié)論
列式數(shù)據(jù)存儲(chǔ)提供:
- 通過壓縮實(shí)現(xiàn)存儲(chǔ)效率
- 通過列裁剪和謂詞下推實(shí)現(xiàn)減少 I/O
- 使用向量化處理和優(yōu)化連接實(shí)現(xiàn)更快的執(zhí)行速度
它們廣泛用于 Web 分析、商業(yè)智能、機(jī)器學(xué)習(xí)基礎(chǔ)設(shè)施和實(shí)時(shí)分析。
如果您是數(shù)據(jù)從業(yè)者,了解這些內(nèi)部原理可以幫助您優(yōu)化性能。 如果您是工程負(fù)責(zé)人,這些技術(shù)將幫助您評(píng)估權(quán)衡并為您的組織做出戰(zhàn)略決策。