Query-Performance

具有多個 OR 語句的查詢的行與列 DB

  • August 13, 2020

我了解列式數據庫非常適合不使用很多欄位進行查找的快速查詢,但是如果您只使用 OR 語句怎麼辦?

例如,我想要所有具有 (Val A, Col A) OR (Val B, Col B) OR (Val C, Col C) OR…(Val N, Col N) 的記錄

我希望我問的很清楚。

編輯:

查詢 OR 語句看起來A = 1 OR B = 3 OR C = 6 ... OR N = 7

我這樣做的原因是我會有一個行/記錄,其中每個 col/欄位都被加密,並且我希望所有與任何欄位匹配的記錄都可以進行分群練習。這個查詢每秒可以執行 100 次。

此答案中的範例是從 SQL Server 的角度編寫的。重複這個問題,當 WHERE 子句是一系列 OR 語句時,您需要快速查詢。查詢將針對 4 到 20 個不同的列進行過濾,而您事先並不知道這些列。第一個查詢可能如下所示:

SELECT COUNT(*)
FROM #Q273599
WHERE ID1 = 1 OR ID2 = 2 OR ID4 = 4 OR ID5 = 5;

第二個查詢可能如下所示:

SELECT COUNT(*)
FROM #Q273599
WHERE ID1 = 1 OR ID2 = 2 OR ID8 = 8 OR ID9 = 9 OR ID10 = 10;

這對於關係數據庫來說仍然是一個難題,具體取決於表的大小和所需的查詢響應時間。最快的方法可能是在每一列上定義一個單列索引,並使用帶有查詢優化器的 RDBMS,該查詢優化器能夠找到一個索引聯合計劃。從儲存、容量限製或 DML 成本的角度來看,為每一列創建索引可能是不切實際的。

一般來說,可以公平地說,對於這種類型的查詢,列儲存比行儲存更好。Microsoft 列出了一個類似的問題(最終使用者在房地產網站上通過數百個不同的過濾器進行搜尋)作為列儲存有效性的一個很好的案例研究。我認為這就像您要掃描整個表一樣簡單,您不妨掃描一個較小的表,因為與行儲存相比,列儲存提供的壓縮通常更好。與行儲存相比,不需要表中的所有列當然會使列式儲存更具吸引力。

如果您真的關心性能,我建議您模擬一些範例數據並嘗試一下。對於下面的表和查詢,我最終得到了 4 秒的行儲存查詢響應時間、1 秒的列儲存響應時間和 13 毫秒的所有列都被索引的響應時間。這只是說明一般觀點的一個例子。您的數據是問題的重要組成部分。

CREATE TABLE #Q273599 (
   ID1 BIGINT NOT NULL,
   ID2 BIGINT NOT NULL,
   ID3 BIGINT NOT NULL,
   ID4 BIGINT NOT NULL,
   ID5 BIGINT NOT NULL,
   ID6 BIGINT NOT NULL,
   ID7 BIGINT NOT NULL,
   ID8 BIGINT NOT NULL,
   ID9 BIGINT NOT NULL,
   ID10 BIGINT NOT NULL,
   PADDING CHAR(500) NOT NULL
);


INSERT INTO #Q273599 WITH (TABLOCK)
SELECT q.RN, RN, RN, RN, RN, RN, RN, RN, RN, RN, ''
FROM
(
   SELECT TOP (25000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
   FROM master..spt_values t1
   CROSS JOIN master..spt_values t2
   CROSS JOIN master..spt_values t3
) q;

SELECT COUNT_BIG(*)
FROM #Q273599
WHERE ID1 = 1 OR ID2 = 2 OR ID4 = 4 OR ID5 = 5 OR ID6 = 6 OR ID7 = 7 OR ID9 = 9 OR ID10 = 9999999999999
OPTION (MAXDOP 1);

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