2011-10-07 49 views
1

比方說,我們有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分區時,它將更直接地選擇僅查找列的數據。

評論?

+0

可能重複[按年份分區與單獨的表名爲Data_2011,Data_2010等](http://stackoverflow.com/questions/7556404/partitioning-by-year-vs-separate- (命名爲data-2011-data-2010-etc) – JNK

回答

3

我已經實現了SQL Server 2000上分區視圖取得了巨大成功

確保,你有這將限制今年列到今年每個表檢查約束。所以在Fact_2010表將被檢查年份= 2010

然後也使視圖UNION承滴盤不只是UNION

現在,當您查詢一年視圖應該只是獲得1臺,你可以驗證這一點與執行計劃

如果你沒有檢查約束到位就會觸動所有都認爲

,真正的分區將有一個明顯的優勢的一部分的表,因爲 僞首先分區執行視圖從Fact_2010表中拉了回來所有的 列,然後濾除小至一個 列終端用戶選擇

如果您有到位的優化是足夠聰明的制約只是去你需要的表

+0

假設你的「確定」評論是真實的(我預計它會是這樣):-),這是一個很棒的信息知道和我,一個令人驚訝的事實!經過深思熟慮:在所有FACT表的UNION中,YEAR上的索引查看是否比每個物理表上Year的單獨索引更具應用性?另外,雖然UNION ALL更具爆炸性,更好的選擇,但我不明白UNION如何在給定約束的情況下返回不同的結果。註釋?非常感謝你的回答。我愛它。 – ChadD

+0

索引視圖必須保持,所以你所有的更新刪除和插入將更慢..你需要更多的空間在你的數據庫來存儲該視圖 – SQLMenace

+0

@Chad:關於聯盟所有與聯盟,這不是關於是否結果是不同,而是關於擺脫聯盟所做的絕對不必要的排序(因爲暗含的DISTINCT)。 –

相關問題