在MSDN中关于分区功能,$PARTITION(Transact-SQL)。
我对以下示例正在进行的操作感到困惑。我的理解是,这个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 :(得分:1)
如果您的parition函数定义为
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
行,因为它会将分区中的所有行(如果有)分组到一个组中。
如果任何分区都没有行,则结果集中不会返回任何行。
答案 1 :(得分:0)
它返回分区表Production.TransactionHistory
中每个非空分区中的记录数,所以是的,你的推理是正确的。
答案 2 :(得分:0)
您是否尝试为声明生成执行计划?这可能会让你深入了解它在封面下的实际行动。
如果您想要一些解释,请按“Control-L”生成执行计划并在此处发布。