我认为这将是一个相当简单的问题,但实际上我很难找到答案。
问题:您能否通过简单地更新分区列使其跨越分区边界来将分区表中的数据行从一个分区移动到另一个分区?
例如,如果我有一个具有分区键的表:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
使用映射到主键的分区函数:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
我可以通过将 SampleID 从 1 更改为(例如)500,000 将一行从第一个分区移动到第三个分区吗?
注意:我将其标记为 sql server 2005 和 2008,因为它们都支持分区。他们的处理方式不同吗?
我没有要测试的 2005 服务器。然而,2008 年似乎按预期处理了这个问题:
您应该在更新之前在每个分区中看到一条记录,然后在第一个分区中看到两条记录。
为了测试这一点,实验实际上需要对表进行分区。请参阅http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
查询分区函数只是告诉你分区函数说什么。它没有说明数据存储在哪里。您可以设置一个分区函数并运行它,而无需实际对表进行分区,正如这里已经演示的那样。
为了对表进行分区,您还必须创建文件组和使用分区函数将函数结果分配给文件组的分区方案。然后,您必须在使用该分区方案的表上放置一个聚集键。
设置分区
我不是命令行 SQL 方面的专家。我使用 SSMS 界面来设置文件组 pfg1(带有 pf1 文件)和 pfg2(带有 pf2 文件)。然后我声明了分区函数和方案:
创建表和聚集索引
完成此操作后,当您查询 sys.partitions(我有 2005)时,您会看到该表现在有两个分区,而不仅仅是一个用于该表的分区。这表明我们已经为这个表完全实现了分区。
现在我们有两个分区(每个分区都有一个行数),我们可以进行实验。
插入行
检查 sys.partitions 以了解发生了什么。
是的。每个分区中的一行。
移动一行。
检查分区
第一个分区现在有两行而不是 1,第二个分区有零行而不是两行。
我认为这证实了由于修改分区表中的聚集键而自动移动了该行。
老帖子,但很有帮助!!
我通过在更新后截断分区 2 证明它确实在 SQL Server 2017 中移动,并且记录仍然存在于分区 1 中
我不认为这个答案是正确的。当您使用该值时
您只是在重新计算分区应该是什么,而不是当前记录在哪里。
你应该使用:
在我对 sql 2005 的测试中,值发生了变化,但记录保持在同一个分区中。这可能会混淆统计信息和优化器,因为它将以多线程模式运行,期望分区在特定范围内。当它试图使用分区消除来仅查询相关分区时,它也将是完全错误的。我认为您需要删除并重新插入每条记录以使它们移动。