如何将单一Table转移 (Switch) 至Partition Table上

时间:2019-09-05
本文章向大家介绍如何将单一Table转移 (Switch) 至Partition Table上,主要包括如何将单一Table转移 (Switch) 至Partition Table上使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

之前看了一些关于Partition Table可以透过Switch的方式转移某个Partition到另一个非Partition Table上,来降低Insert Into大量数据会造成IO的问题。


但是我有另一需求是反向作业,就是将非Partition Table的数据Switch到Partition Table上。如下图所示我有一张记载当年度的Table叫Answers,然后年底会将Answers的数据转移到AnswersHistory上,并清空Answers的数据表来记录下一年度。

下图中我们可以看到AnswersHistory存放了101~105年度的数据,而Answers放的是106年度数据(笔数为10000笔)。本LAB就是要采用Switch的方式将Answers的106年度数据倒到AnswersHistory中。

我们看一下Answers跟AnswersHistory目前的不同处就只有索引,AnswersHistory多了3个索引IX1 IX2 IX3,其他像字段PK则完全一样。(注意:要能使用Switch这一个功能需要两张Table都在相同的File Group下)。​

下图中我们看一下目前AnswersHistory各Partition的数据笔数,红色圈选处可以看到Partition 6的笔数是0笔。

接下来我们用下面语法来做数据表Switch的动作。

Alter Table Answers Switch To AnswersHistory Partition 6

执行后发生错误,错误消息是表示Answers缺少AnswersHistory上面的IX1索引

当我们在Answers上建立跟AnswersHistory上一模一样的IX1索引后再次Switch,SQL还是报错,错误消息表示Answers数据表缺少IX2。

当我们在Answers上建立跟AnswersHistory上一模一样的IX2索引后再次Switch,SQL还是报错,错误消息表示Answers数据表缺少IX3。

当我完成所有索引建立后再执行Switch,还是报错。只是这次消息不同,如下图蓝色圈选处

/*
消息4982,层级16,状态1,行1
ALTER TABLE SWITCH 陈述式失败。来源数据表'DB1.dbo.Answers' 的检查条件约束所允许的值,
于目标数据表'DB1.dbo.AnswersHistory' 数据分割'6' 上定义的范围并不允许。
*/

看到这消息还真不知道改怎么解,后来拜了google大神后在一篇文中找到说明。将数据从Source Table转入Target Table,因为没有CONSTRAINT,在转换数据时Target Table不知道正确的数据范围,所以会报错。

解法就是在Answers数据表加入Constraint去限制hy的值一定都是106,如下图所示。

当我完成上一步骤后,我再次执行Switch的语法就成功完成。

接下来Count两张数据表,可以看到Answers没有笔数,而AnswersHistory则多了106年度的10000笔数据。

从Partitions角度来看,AnswersHistory的Partition 6也是有了10000笔数据。所以表示我们已经成功将Answers的数据全部转到AnswersHistory的Partition 6了。

我是ROCK

rockchang@mails.fju.edu.tw

原文:大专栏  如何将单一Table转移 (Switch) 至Partition Table上


原文地址:https://www.cnblogs.com/petewell/p/11465526.html