Sql-Server

表分區對我有幫助嗎?

  • April 27, 2018

我有 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)

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