天天看點

SQLSERVER将一個檔案組的資料移動到另一個檔案組

移動資料:

1、有表分區

2、沒有表分區

我這裡隻讨論沒有表分區的情況

例子

比如:你有三個檔案組,其中一個是主檔案組

測試腳本:

上面的腳本雖然簡單,但是隐藏了非常多的知識點

知識點1:建立了兩個檔案組,現在資料庫有三個檔案組,包括主檔案組,當你不指定任何參數的時候預設建立出來的資料檔案是1MB大小

SQLSERVER将一個檔案組的資料移動到另一個檔案組

知識點2:插入資料,因為表是建立在[FG_Test_Id_01]檔案組上,是以資料都會放在E:\FG_TestUnique_Id_01_data.ndf

SQLSERVER将一個檔案組的資料移動到另一個檔案組

知識點3:建立聚集索引,其實這句話裡面包含了幾個動作,在E:\FG_TestUnique_Id_02_data.ndf檔案上配置設定頁面,并把aa表的資料

放進去E:\FG_TestUnique_Id_02_data.ndf檔案,其實這裡聚集索引成為了移動資料的中介,我在

SQLSERVER聚集索引與非聚集索引的再次研究(上)文章寫到:聚集索引葉子節點就是資料,我們把聚集索引(一定要是聚集索引,非聚集索引不是)

建立在E:\FG_TestUnique_Id_02_data.ndf檔案上實際上就是把資料頁面和聚集索引頁面移動到E:\FG_TestUnique_Id_02_data.ndf檔案裡

因為SQLSERVER是沒有 ALTER TABLE aa(id INT ,cname NVARCHAR(4000)) ON [FG_Test_Id_01] 這種文法上

就是說你一旦建表并且表中已經有資料之後,如果你要移動表資料,隻能通過聚集索引這個中介來移動表資料

SQLSERVER将一個檔案組的資料移動到另一個檔案組

從下圖可以看出資料都已經移動到E:\FG_TestUnique_Id_02_data.ndf檔案上

SQLSERVER将一個檔案組的資料移動到另一個檔案組

知識點4:為什麽要加上WITH(ONLINE=ON)??如果你的應用是不能停機的話,加上WITH(ONLINE=ON)就可以線上的建立索引

詳情參考:CREATE INDEX (Transact-SQL)

知識點5:為什麽要收縮[FG_Test_Id_01]檔案組檔案E:\FG_TestUnique_Id_01_data.ndf

因為資料已經移動到E:\FG_TestUnique_Id_02_data.ndf檔案上了,既然已經移到E:\FG_TestUnique_Id_02_data.ndf檔案上

為什麽E:\FG_TestUnique_Id_01_data.ndf檔案還顯示5MB大小??

大家可以看一下這篇文章:聚集索引表插入資料和删除資料的方式是怎樣的

我delete了資料,SQLSERVER卻沒有完全釋放空間,其實這裡移動資料到别的檔案/檔案組相當于delete了資料了 但是SQLSERVER并沒有釋放這些空間,是以我需要收縮一下FG_Test_Id_01檔案組檔案
SQLSERVER将一個檔案組的資料移動到另一個檔案組
SQLSERVER将一個檔案組的資料移動到另一個檔案組
SQLSERVER将一個檔案組的資料移動到另一個檔案組

知識點6:DBCC SHRINKFILE(FG_TestUnique_Id_01_data,1)

SHRINKFILE的機關是MB,上面的語句就是收縮到1MB大小,其實這裡如果E:\FG_TestUnique_Id_01_data.ndf檔案有資料的話

并且需要占用2MB大小的空間,那麼您使用DBCC SHRINKFILE(FG_TestUnique_Id_01_data,1)這句話隻能收縮到2MB大小

并不會收縮到1MB大小的,因為這些資料需要占用空間,你怎麽收縮都收縮不了的,不信的話您們可以測試一下

相關文章:

DBCC SHRINKFILE (Transact-SQL)

user database的initial size和dbcc shrinkfile

總結

雖然移動資料的動作比較簡單,但是知識點挺多的,有些人隻知道怎麽做,不知道為什麼我覺得這樣不好

尋根問底是我的特性o(∩_∩)o 哈哈

注意:移動資料隻能一張表一張表的移動,如果表裡預先已經有聚集索引,需要先drop掉

移動之前查一下表中的資料在哪個檔案組中

SQLSERVER将一個檔案組的資料移動到另一個檔案組

如有不對的地方,歡迎大家拍磚o(∩_∩)o

2014-1-19 補充:

有表分區的方法

大概有三種

先建立新的資料檔案,檔案組,分區方案,分區函數

例如建立三個新的資料檔案和檔案組,分區方案和分區函數對于這三個新的資料檔案和檔案組

舊表:無論已經分區或者還沒有分區都适用下面三種方法:

方法一:建立中間表(新表),中間表建立在新的分區方案上,然後用insert into 新表 select * from 舊表的方法,插入完畢之後

drop掉舊表

方法二:建立中間表,中間表建立在新的分區方案上,然後用switch to,因為新分區方案有三個分區

那麼,switch to隻能夠将表的全部資料切換到其中一個分區

或者

上面的三條語句就會把舊表的所有資料移動到新表的某個分區,至于移動到哪個分區由最後那個數字來指定PARTITION 要移動到的分區的數字

完成後drop掉舊表

方法三:drop掉舊表的聚集索引(如果有),然後在舊表上建立一個聚集索引,建立聚集索引的時候指定新的分區方案

這樣就會把表資料移動到新分區方案,即新的資料檔案裡,這個方法跟沒有表分區的資料移動是一樣的

參考文章:http://blog.csdn.net/smallfools/article/details/4930810

删除檔案和删除檔案組

删除失效檔案組 (SQL Server)

移資料

繼續閱讀