2009-03-01 47 views
1

在這裏MSDN關於分區功能,$PARTITION(Transact-SQL)SQL Server 2005中的分區功能

我很困惑下面的例子是在底層做什麼。我的理解是,此SQL語句將迭代表Production.TransactionHistory中的所有行,因爲對於映射到同一分區的所有行,$ PARTITION.TransactionRangePF1(TransactionDate)將返回相同的值,即所有分區號這樣的行。因此,例如,分區1中的所有行都會返回一行,因爲它們都是$ PARTITION.TransactionRangePF1(TransactionDate)的相同值。我的理解正確嗎?

USE AdventureWorks ; 
GO 
SELECT $PARTITION.TransactionRangePF1(TransactionDate) AS Partition, 
COUNT(*) AS [COUNT] FROM Production.TransactionHistory 
GROUP BY $PARTITION.TransactionRangePF1(TransactionDate) 
ORDER BY Partition ; 
GO 

回答

0

它返回的記錄數中的每個分區表中Production.TransactionHistory非空的分區,所以是你的推理是正確的。

+0

我明白了最後的結果,米奇。 :-) 我的問題是關於內部執行什麼來獲得結果。你能否幫助我檢閱我的文章,看看我的理解是否正確? :-) – George2 2009-03-01 14:06:28

0

您是否嘗試過爲該語句生成執行計劃?這可能會讓你對封面下面的實際操作有所瞭解。

按下「Control-L」生成一個執行計劃,並在這裏發佈,如果你想要一些解釋。

1

如果你的分區之前的功能就像是

CREATE PARTITION FUNCTION TransactionRangePF1(DATETIME) 
AS RANGE RIGHT FOR VALUES ('2007-01-01', '2008-01-01', '2009-01-01') 

,則該條款規定:

$PARTITION.TransactionRangePF1(TransactionDate) 

等同於:

CASE 
    WHEN TransactionDate < '2007-01-01' THEN 1 
    WHEN TransactionDate < '2008-01-01' THEN 2 
    WHEN TransactionDate < '2009-01-01' THEN 3 
    ELSE 4 
END 

如果你所有的日期'2007-01-01'前下跌,那麼第一個WHEN子句將始終激活並且總是返回1

您發佈的查詢將爲每個分區返回至多1行,因爲它會將分區中的所有行(如果有)分組到一個組中。

如果沒有任何分區的行,則結果集中不會返回任何行。