比方說,我們有5個表Unioning僞分區表到一個視圖
Fact_2011
Fact_2010
Fact_2009
Fact_2008
Fact_2007
每一個通過表名的擴展中指明一年只存儲數據。
然後,我們在每個這些表上創建一個單獨的索引,其中列「Year」作爲索引的第一列。
最後,我們創建一個視圖,vwFact
,這是所有表的工會:
SELECT * FROM Fact_2011
UNION
SELECT * FROM Fact_2010
UNION
SELECT * FROM Fact_2009
UNION
SELECT * FROM Fact_2008
UNION
SELECT * FROM Fact_2007
,然後執行查詢,像這樣:
SELECT * FROM vwFact WHERE YEAR = 2010
或不太可能的情況下,
SELECT * FROM vwFact WHERE YEAR > 2010
這些查詢如何有效地與實際參與比較年份數據或基本相同?是否在這些僞分區表上有Year
的索引需要什麼來防止SQL引擎浪費大量時間來確定包含所需日期範圍之外的記錄的物理表不值得掃描?或者,這種僞分區方法究竟是MS分區(按年)做的事情?
在我看來,如果執行的查詢是
SELECT Col1Of200 FROM vwFact WHERE YEAR = 2010
,真正的分區將有一個明顯的優勢,因爲僞分區首先必須從Fact_2010
執行拉圖後所有的列然後過濾到最終用戶選擇的一列,而使用MSSQL分區時,它將更直接地選擇僅查找列的數據。
評論?
可能重複[按年份分區與單獨的表名爲Data_2011,Data_2010等](http://stackoverflow.com/questions/7556404/partitioning-by-year-vs-separate- (命名爲data-2011-data-2010-etc) – JNK