使用2个列进行表分区

20

除了只使用一个分区函数,是否可能使用2个列来划分表格?

考虑一个有3列的表:

    ID (int, primary key, 
    Date (datetime), 
    Num (int)

我想通过2个列DateNum来划分这个表。

这是我使用1个列(日期)对表进行分区的方法:

create PARTITION FUNCTION PFN_MonthRange (datetime)
AS
RANGE left FOR VALUES ('2009-11-30 23:59:59:997',
                       '2009-12-31 23:59:59:997',
                       '2010-01-31 23:59:59:997',
                       '2010-28-02 23:59:59:997',
                       '2010-03-31 23:59:59:997')
go
3个回答

53

坏消息:分区函数必须定义在单个列上。

好消息:那个单独的列可以是一个持久化计算列,它是你试图按其进行分区的两个列的组合。


6
我不确定你的“坏消息”是否正确。我没有问题在多个列上指定分区,例如 SELECT ROW_NUMBER() OVER (PARTITION BY a.c1, b.c2, a.c3 ORDER BY a.c1, b.c2, a.c3, a.c4) FROM ...,并且 http://msdn.microsoft.com/en-us/library/ms189461%28v=sql.105%29.aspx 明确显示您可以为分区指定多个值表达式。我有什么遗漏吗? - Nathan
13
@Nathan:原始问题是关于表分区的,而不是关于窗口函数的。 - Joe Stefanelli
2
啊!看到其他得到赞同的答案,我猜我不是唯一犯这个错误的人! - Nathan

6
我发现这是一个更简单的解决方案。
select ROW_NUMBER() over (partition by CHECKSUM(value,ID) order by SortOrder) as Row From your_table

11
校验和可以从不同的输入值产生相同的输出值(基本上是哈希碰撞)。因此,这种方法不是100%可靠的。所以,如果您的分区绝对必须正确,请不要使用此方法。如果您可以容忍偶尔出现的错误分区,则可以使用此方法。 - Nathan
5
我认为这个问题与表分区有关,而不是窗口函数。 - Sourabh Jain

4
本地情况下,SQL Server 不能按两列进行分区。你可以采取一些措施,例如使用查找表来提取每个值所在的任意整数(分区),但是最多只能有1000个分区,它们将开始占用相同的空间。计算列方法也存在这个问题,你只有1k个分区限制,很可能会超过限制。我建议仅使用日期分区,在月初范围右侧而不是在月末范围左侧。你打算从第二个分区值中获得什么?

1
拥有两个分区列可能用于多租户和日期保留分区,但n轴分区很难处理模拟,并且没有真正的支持,正如原始限制所证明的那样。(此外,7年后限制为15k个分区:D) - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接