SQL Server 2005中的分区函数

时间:2009-03-01 13:56:19

标签: sql-server sql-server-2005 partitioning

在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

3 个答案:

答案 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”生成执行计划并在此处发布。