2012-07-08 53 views
0

我不清楚在SQL server中使用$PARTITION的目的吗?我已经阅读了MSDN的内容,但仍不明白。

你可以使用它有什么好处?

+0

你在问关于分区表(http://msdn.microsoft.com/en-us/library/ms188071.aspx)的'$ PARTITION'函数是否正确?您不是在询问有关分区结果集的Transact-SQL中的“PARTITION BY”子句(http://msdn.microsoft.com/zh-cn/library/ms176102),对不对? – 2012-07-08 12:18:49

回答

0

分区表中的一个数据库意味着它分割成多片,同时仍像一个单一的表对其进行处理。我们在这里讨论关于水平分区的问题,这意味着每个分区都包含所有列但只包含一些行。为此,您必须定义一个分区函数,该函数根据分区列中该行的值来定义行所属的分区。 $PARTITION告诉你一行属于哪个分区。

比方说,我们有一个整数列表示我们行的评分,我们预计用户通常只会询问评分高于4的项目。我们可以根据评分进行划分。我们的分区功能可以是:

CREATE PARTITION FUNCTION partitionByRating (int) FOR VALUES (4); 

然后,找出哪个分区我们的表中的行属于,我们可以查询:

SELECT $partition.partitionByRating(i.Rating) AS [Partition Number], 
    rating AS [Rating], 
    name AS [Item Name] 
FROM dbo.Items AS i 

而且我们会获得类似的结果:

Partition Rating Item Name 
1   1   Ball 
1   4   Scooter 
2   5   Blaster 

这意味着Ball和Scooter将被存储在一起,但取决于如何将分区分配给存储,Blaster可能存储在其他地方。

0

您可以使用此功能来确定将用于特定值的分区号。例如,按日期分区表,这会告诉你哪些分区将被用于2001年7月1日,你该值插入表中,甚至前:

SELECT $PARTITION.PF_RangeByYear('20010701') 

你也可以用它来找到行计数在每一个分区号:

SELECT $partition.PF_RangeByYear(orderdate) AS partition#, 
    COUNT(*) AS cnt 
FROM Orders 
GROUP BY $partition.PF_RangeByYear(orderdate); 

这可以说是你可以做的sys.partitionssys.dm_db_partition_stats简单得多。

(这两个例子都从Itzik's SQL Mag article here获得。)