SQL Server 合并(刪除)分區解惑
一、準備
在SQL Server 2005版本之后就有了表分區的概念與應用,在分區操作里面有一個叫做合并分區的功能,也被稱為刪除分區。分區所處的文件組和文件是不會被刪除的,只會對數據進行轉移合并。合并分區時需要注意所帶來的IO問題。
合并分區常見情景:發現某個分區的數據很少,為了方便管理可以考慮合并分區。需要進行統計、四則運算的時候也可以考慮合并分區,這種情形下并沒有對比合并與分區之間的性能,如果某位童鞋有興趣和環境的話可以提供這方面的數據。
查看分區方案的方式:在SQL Server Management Studio中,選擇數據庫-->存儲-->分區方案,右擊分區方案名,在彈出的菜單中選擇“編寫分區方案腳本為”-->CREATE到-->新查詢編輯器窗口。
二、測試
(一) 環境:使用RANGE RIGHT作為分區函數的關鍵字,它表示這個值開始是屬于右邊界的。
RANGE RIGHT FOR VALUES ('20100101','20110101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
[過去某年, 2010/01/01) |
[FG2] |
2 |
[2010/01/01, 2011/01/01) |
[FG3] |
3 |
[2011/01/01, 2012/01/01) |
[FG4] |
4 |
[2012/01/01, 2013/01/01) |
[PRIMARY] |
5 |
[2013/01/01, 未來某年) |
1. 測試一:刪除分區函數的第一個值
當使用MERGE RANGE ('20100101'),合并后分區就相當于:
RANGE RIGHT FOR VALUES ('20110101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG?] |
1 |
[過去某年, 2011/01/01) |
[FG3] |
2 |
[2011/01/01, 2012/01/01) |
[FG4] |
3 |
[2012/01/01, 2013/01/01) |
[PRIMARY] |
4 |
[2013/01/01, 未來某年) |
問題:是[FG1]合并到[FG2],還是[FG2]合并到[FG1]呢?
測試結果:[FG2]合并到[FG1]
2. 測試二:刪除分區函數的第二個值
當使用MERGE RANGE ('20110101'),合并后分區就相當于:
RANGE RIGHT FOR VALUES ('20100101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
[過去某年, 2010/01/01) |
[FG?] |
2 |
[2010/01/01, 2012/01/01) |
[FG4] |
3 |
[2012/01/01, 2013/01/01) |
[PRIMARY] |
4 |
[2013/01/01, 未來某年) |
問題:是[FG2]合并到[FG3],還是[FG3]合并到[FG2]呢?
測試結果:[FG3]合并到[FG2]
3. 測試三:刪除分區函數的最后一個值
當使用MERGE RANGE ('20130101'),合并后分區就相當于:
RANGE RIGHT FOR VALUES ('20100101','20110101','20120101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
[過去某年, 2010/01/01) |
[FG2] |
2 |
[2010/01/01, 2011/01/01) |
[FG3] |
3 |
[2011/01/01, 2012/01/01) |
[?] |
4 |
[2012/01/01, 未來某年) |
問題:是[FG4]合并到[PRIMARY],還是[PRIMARY]合并到[FG4]呢?
測試結果:[PRIMARY]合并到[FG4]
(二) 環境:使用RANGE LEFT作為分區函數的關鍵字,它表示這個值開始是屬于左邊界的。
RANGE LEFT FOR VALUES ('20100101','20110101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
(過去某年, 2010/01/01] |
[FG2] |
2 |
(2010/01/01, 2011/01/01] |
[FG3] |
3 |
(2011/01/01, 2012/01/01] |
[FG4] |
4 |
(2012/01/01, 2013/01/01] |
[PRIMARY] |
5 |
(2013/01/01, 未來某年] |
1. 測試四:刪除分區函數的第一個值
當使用MERGE RANGE ('20100101'),合并后分區就相當于:
RANGE LEFT FOR VALUES ('20110101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG?] |
1 |
(過去某年, 2011/01/01] |
[FG3] |
2 |
(2011/01/01, 2012/01/01] |
[FG4] |
3 |
(2012/01/01, 2013/01/01] |
[PRIMARY] |
4 |
(2013/01/01, 未來某年] |
問題:是[FG1]合并到[FG2],還是[FG2]合并到[FG1]呢?
測試結果:[FG1]合并到[FG2]
2. 測試五:刪除分區函數的第二個值
當使用MERGE RANGE ('20110101'),合并后分區就相當于:
RANGE LEFT FOR VALUES ('20100101','20120101','20130101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
(過去某年, 2010/01/01] |
[FG?] |
2 |
(2010/01/01, 2012/01/01] |
[FG4] |
3 |
(2012/01/01, 2013/01/01] |
[PRIMARY] |
4 |
(2013/01/01, 未來某年] |
問題:是[FG2]合并到[FG3],還是[FG3]合并到[FG2]呢?
測試結果:[FG2]合并到[FG3]
3. 測試六:刪除分區函數的最后一個值
當使用MERGE RANGE ('20130101'),合并后分區就相當于:
RANGE LEFT FOR VALUES ('20100101','20110101','20120101')
文件組 |
分區 |
取值范圍 |
[FG1] |
1 |
(過去某年, 2010/01/01] |
[FG2] |
2 |
(2010/01/01, 2011/01/01] |
[FG3] |
3 |
(2011/01/01, 2012/01/01] |
[?] |
4 |
(2012/01/01, 未來某年] |
問題:是[FG4]合并到[PRIMARY],還是[PRIMARY]合并到[FG4]呢?
測試結果:[FG4]合并到[PRIMARY]
三、結論
下圖中形象的表述了邊界值(boundary_value)所處的分區,符號“()”表示不包含,“[]”表示包含,一個圓圈帶叉圖標表示需要刪除這個邊界值,當使用MERGE RANGE的時候,數據庫就需要刪除一個分區的數據,并把數據合并到另外一個分區中。你能從下圖看出結論嗎?
(圖1:分區函數為右邊界)
(圖2:分區函數為左邊界)
結論:刪除的這個邊界值(boundary_value)屬于哪個分區,那么就會刪除這個分區,再向鄰近的分區合并。鄰近的意思是以這個邊界值為臨界點的兩個分區。圖1與圖2就很好的解釋了這個結論。
四、參考文獻
留言列表