如何將單一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