2009-03-01 97 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行,因为它会将分区中的所有行(如果有)分组到一个组中。

如果没有任何分区的行,则结果集中不会返回任何行。