簡體   English   中英

為快速即席查詢構建100M記錄表的好方法是什么?

[英]What's a good way to structure a 100M record table for fast ad-hoc queries?

場景很簡單,一個表中有大約100M記錄,有10列(分析數據類型),我需要能夠對這10列的任意組合執行查詢。 例如這樣的事情:

  • 過去3個月內有多少a = 3 && b > 100記錄?

基本上所有查詢都是在時間間隔Y中有多少具有屬性X記錄 ,其中X可以是這10列的任意組合。

數據將繼續存在,它不僅僅是預先給定的100M記錄集,而是隨着時間的推移而增長。

由於列選擇可以是完全隨機的,因此很可能無法為流行組合創建索引。

這個問題有兩個部分:

  • 我應該如何在SQL數據庫中構建它以盡可能快地進行查詢,以及我可以采取哪些一般性步驟來提高性能?
  • 是否有任何類型的NoSQL數據庫針對此類搜索進行了優化? 我只能想到ElasticSearch,但我不會在這個大型數據集上表現得很好。

如果沒有索引,您調整RDBMS以支持此類處理的選項將受到嚴格限制。 基本上你需要大規模並行和超快速套件。 但顯然你沒有存儲實際數據,所以RDBMS是錯誤的。

追求並行路線,行業標准是Hadoop 您仍然可以通過Hive使用SQL樣式查詢。

另一個noSQL選項是考慮一個柱狀數據庫。 這些是在不使用多維數據集的情況下組織分析數據的替代方法。 他們擅長快速加載數據。 Vectorwise是競技場中的最新玩家。 我沒有親自使用它,但是昨晚倫敦數據聚會的某個人對我贊不絕口。 看看吧

當然,遠離SQL數據庫 - 無論走向何方 - 都會產生陡峭的學習曲線。

您應該構建一個SSAS多維數據集並使用MDX進行查詢。

多維數據集具有“聚合”,這意味着提前計算結果。依賴於如何配置多維數據集(以及聚合),您可以在度量值組上具有SUM屬性(例如A),並且每次詢問多維數據集時A有很多記錄,它只會讀取聚合而不是讀取所有表並進行計算。

就Oracle而言,這很可能被構造為一個區間分區表,在您可能查詢的每一列上都有本地位圖索引,並且通過直接路徑插入或分區交換添加新數據。

可以使用一組物化視圖優化對流行的列組合的查詢,可能使用匯總或多維數據集查詢。

要使用SQL解決方案快速運行這些查詢,請使用這些經驗法則。 雖然有很多警告,但您使用的實際SQL引擎與解決方案非常相關。

我假設您的數據是整數,日期或短期縮放器。 長串等改變游戲。 我還假設你只使用固定比較(=,<,>,<>等)

a)如果每個查詢中都存在時間間隔Y,請確保將其編入索引,除非Y謂詞選擇了大部分行。 確保行以“Y”順序存儲,以便它們彼此相鄰地打包在磁盤上。 無論如何,對於新數據,這將自然發生。 如果Y謂詞非常緊(即幾百行),那么這可能就是你需要做的。

b)你在做“選擇”或“選擇計數( )”嗎? 如果不是“select *”,那么垂直分區可能會有所幫助,具體取決於引擎和其他索引。

c)為值廣泛分布的每列創建單列索引,並且沒有太多重復項。 索引YEAR_OF_BIRTH通常可以,但索引FEMALE_OR_MALE通常不好 - 盡管這是高度數據庫引擎特定的。

d)如果您有像FEMALE_OR_MALE這樣的列並且“Y謂詞”很寬,那么您會遇到另一個問題 - 從大多數行中選擇女性數量的計數將會發生變化。 您可以嘗試索引,但取決於引擎。

e)如果可能的話,嘗試使列“非空” - 通常每行節省1位,並且可以簡化內部優化器操作。

f)更新/插入。 創建索引通常會損害插入性能,但如果您的速率足夠低,則可能無關緊要。 只有100M行,我假設你的插入率相當低。

g)多段密鑰會有所幫助,但你已經說過它們不行了。

h)獲取高速磁盤(RPM) - 這些類型的查詢的問題通常是IO(TPC-H基准測試是關於IO,你聽起來像“H”問題)

還有更多選項,但這取決於您希望花費多少精力來“盡可能快地進行查詢”。 有很多No-SQL和其他選項可以解決這個問題,但我會將問題的這一部分留給其他人。

除上述建議外,請考慮查詢更新的物化視圖。 我想我只是在桌面上用cube()物化視圖創建一個select,count(*)組。

這將為您提供一個完整的多維數據集。 在一個小型測試台上玩這個,以了解多維數據集匯總的工作方式。 查看Joe Celko的書籍以獲取一些示例,或者只是點擊您的特定RDBMS文檔以獲取示例。

如果您必須始終能夠查詢表中最高達微秒的數據,那么您會陷入困境。 但是如果你能放松這個要求,你會發現物化視圖立方體是一個相當不錯的選擇。

您是否絕對確定您的用戶將以統一的方式訪問所有10列? 在過去的這種情況下,我過早地對自己進行了過度優化,結果卻發現用戶確實在他們的大多數報告中使用了一兩列,並且那些滾動到那些一兩個colunmns是“足夠好”。

如果無法從數據創建OLAP多維數據集,則可以基於X和Y的唯一組合創建匯總表。如果時間段Y具有足夠高的粒度,則匯總表可能相當小。 顯然取決於數據。

此外,您應捕獲用戶運行的查詢。 通常情況下,用戶說他們想要所有可能的組合,在實踐中很少發生這種情況,並且大多數用戶查詢可以從預先計算的結果中得到滿足。 這里的摘要表將是一個選項,您可以使用此選項獲得一些數據延遲,但它可以工作。

如果可能的話,其他選擇是看硬件。 過去我使用Fusion-IO等固態硬盤取得了不錯的成績。 這可以大大減少查詢時間。 這不是優秀設計的替代品,但憑借良好的設計和合適的硬件,它運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM