Join

列式 DBMS 和問題理解多個 where 約束

  • June 27, 2021

我閱讀了很多關於柱狀 DMBS 的內容,並且完全理解它們非常適合研究柱狀圖。這個問題有部分答案。

現在,假設我有一個包含 3 列 A、B 和 C 的 DMBS。

如果實施得當,對每一列進行查詢應該非常快。但我的問題是關於在查詢中加入 AB 和 C 之間的數據,例如 select A,B,C where A > 15 and B == 9 and C < 67

如果每一列都有數百萬行包含相同的值,如何使連接變得非常快?如果查詢不一定涵蓋 A、B 和 C,而是“A 和 C”甚至“B 和 C”怎麼辦?

與可能為空的 30 列的投影相同的問題?

我幾乎不明白連接的效率如何,因為它對我來說就像是掃描。

那麼,我是否應該理解面向列的 DBMS 僅適用於在一列上查找數據?你能分享你的意見嗎?

列儲存擅長掃描。儘管由於分區消除、列消除或段消除的原因,某些查詢在列儲存上的速度非常快,但大多數查詢依賴於這樣一個事實,即在列儲存中掃描數百萬行的速度比在行儲存中更快。

例如,在 SQL Server 中,列段是高度壓縮的,過濾器與批處理模式查詢運算符一起應用,這些運算符對列值的向量而不是單個數據點進行操作,甚至利用SIMD CPU 指令。

在查詢中,例如select A,B,C where A &gt; 15 and B == 9 and C &lt; 67

沒有加入。一般而言,引擎會掃描每一列以查找指示值並編譯行 ID 列表或匹配塊的點陣圖,然後將邏輯操作(and在您的範例中為 s)應用於這些列表/點陣圖,獲得最終的一組匹配行/塊。

引用自:https://dba.stackexchange.com/questions/294502