表分區對我有幫助嗎?
我有 10 張桌子。
dbo.Table2008 dbo.Table2009 ... dbo.Table2018
每個表包含大約 500,000,000 條記錄,這些記錄是 20 列寬(如果重要的話)。每個表上都有一個聚集列儲存索引。
每個表還僅包含其名稱中的年份數據。例如,在
dbo.Table2008
您只會看到CreatedDate
列是>= 20080101
和的記錄<= 20081231
。但是,如果我想在 3 年內發出一個查詢,我需要用一個聯合來訪問所有三個表。我的理論是,如果我有一個名為的表
dbo.Table
,它被劃分為約 120 個分區,每年每個月一個分區,那麼它不僅會減少我的表數。所以我可以改變我的查詢with cte as ( select col1, col2, col3, col4 from table2008 where col4 >= 20080201 and col4 <= 20120801 union select col1, col2, col3, col4 from table2009 where col4 >= 20080201 and col4 <= 20120801 union select col1, col2, col3, col4 from table2010 where col4 >= 20080201 and col4 <= 20120801 union select col1, col2, col3, col4 from table2011 where col4 >= 20080201 and col4 <= 20120801 ) select ... from cte join LookupTable1 on ... = ... join LookupTable2 on ... = ...
到
select col1, col2, col3, col4, lookuptablecol1, lookuptable2col2 from dbo.Table join ALL MY LOOKUP TABLES
我的理論正確嗎?使用分區方案和分區函式
進行表分區是我所追求的嗎? 這個理論在使用聚集列儲存索引時會起作用嗎?
分區聽起來不太適合您的方案。分區不是掉以輕心的事情。它需要大量計劃,您必須重寫 50 億行才能轉換數據。相反,您應該考慮一個
UNION ALL
視圖。根據您的要求,您甚至可以將其設為分區視圖。視圖將為您提供一種無需任何日期移動即可查詢數據的簡單方法。這是迄今為止最簡單的解決方案。
通常,分區不會提高查詢性能。但是,對於列儲存表,如果它可以更好地消除分區列上的行組,那麼它會很有幫助。這可以在不分區的情況下完成,具體取決於您建構列儲存表的方式。如果您不修改舊數據,那麼以保持順序的方式建構列儲存應該相對簡單。
列儲存表確實支持分區,如果您在某些時候確實需要它的話。試驗它很容易。只需嘗試創建一個空的分區列儲存表。
就像您提到的那樣,我在公司中使用相同的分區表,但唯一的區別是,我有月表而不是年表。每個表卷約為 50 GB。
為了查詢屬於不同月份的表,我使用動態 sql 根據傳遞給變數的值選擇正確的表。如果我過了一年,那麼我的查詢將加入屬於那一年的所有表並查找數據。所有這些邏輯都將來自proc。所以,我只是在 proc 中添加參數來建構動態 sql。
例子:
DECLARE @YYYYMM INT = 200801 DECLARE @SearchString VARCHAR(150) = 'customer1' DECLARE @TSQL VARCHAR(5000) DECLARE @Table VARCHAR(100) SET @Table = 'Table' + CONVERT(VARCHAR,@YYYYMM) SET @TSQL = 'SELECT * FROM ' + @Table + ' WHERE Column1 LIKE ''%' + @SearchString +'%''' EXEC (@TSQL)