2013-05-22 41 views
1

我有一個跨越多年的綜合數據集。每個年份的數據存儲在名爲Data的單獨表中。數據目前正在MS ACCESS表中,我將把它遷移到SQL Server。如何管理跨多個表的大型數據集?聯盟vs大桌?

我寧願每年的數據都保存在不同的表中,以便在運行時進行合併和查詢。然而,我不想以犧牲效率爲代價,因爲每年都是大約。有40個領域的150萬條記錄。

我想避免必須在查詢中執行過多數量的UNION。我還想避免在添加每個新年時不得不編輯查詢,導致UNION數量不斷增加。

有沒有一種簡單的方法可以在運行時執行這些UNION,而無需廣泛的SQL查詢和高系統實用程序?或者,如果所有數據都應該在一個大表中進行管理,那麼是否有一種快速簡單的方法將所有表一起追加到單個查詢中?

回答

4

如果你真的想將它們存儲在單獨的表中,那麼我會創建一個視圖,爲你做這個聯合。

create view AllData 
as 
(
    select * from Data2001 
    union all 
    select * from Data2002 
    union all 
    select * from Data2003 
) 

但說實話,如果你使用這個,爲什麼不把所有的數據放到1個表中。然後,如果你想要,你可以通過其他方式創建視圖。

create view Data2001 
as 
(
    select * from AllData 
      where CreateDate >= '1/1/2001' 
      and CreateDate < '1/1/2002' 
) 
+0

您不使用'UNION'。你會使用'UNION ALL'。 – Kermit

+0

夠公平的。編輯。 –

+0

+1您的第二個建議。他們都可以在一張桌子上,每年都有不同的看法。 –

0

單個表可能是此類查詢的最佳選擇。 HOwever你必須平衡這個數據庫正在做的其他工作。

你沒有提到的一個選擇是創建一個包含工會,然後查看視圖的視圖。這樣至少你只需要每年向視圖添加union語句,並且所有使用視圖的查詢都是正確的。就個人而言,如果我這樣做,我會寫一個創建查詢創建表,然後調整視圖以添加該表的聯合。一旦經過測試,我知道它會運行,我將安排它作爲一項工作在一年的最後一天運行。

0

執行此操作的一種方法是使用水平分區。

您基本上創建了一個分區函數,通知DBMS爲每個時期創建單獨的表,每個表都有一個限制,通知DBMS每個特定年份只有數據。

在查詢執行時,優化器可以決定是否可以完全忽略一個或多個分區來加速執行時間。

這種模式的設置開銷並不重要,只有數據的批次纔有意義。儘管每年150萬行看起來很多,但根據您的查詢計劃,這應該不會有什麼大不了(對於體面的SQL Server)。請參閱documentation

+0

。 。 MS Access是否支持水平分區? –

+0

絕對不是,但OP建議遷移到SQL Server。 – paul

0

由於低代表性,我無法添加註釋,但絕對同意1個表,並且分區對於大型數據集很有幫助,並且在數據將遷移到的SQL Server中受支持。

如果數據被大量使用並經常更新,那麼每月分區可能會有用,但如果不是這樣,考慮到大小,分區可能不會很有幫助。