移動資料:
1、有表分區
2、沒有表分區
我這裡隻讨論沒有表分區的情況
例子
比如:你有三個檔案組,其中一個是主檔案組
測試腳本:
上面的腳本雖然簡單,但是隐藏了非常多的知識點
知識點1:建立了兩個檔案組,現在資料庫有三個檔案組,包括主檔案組,當你不指定任何參數的時候預設建立出來的資料檔案是1MB大小

知識點2:插入資料,因為表是建立在[FG_Test_Id_01]檔案組上,是以資料都會放在E:\FG_TestUnique_Id_01_data.ndf
知識點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] 這種文法上
就是說你一旦建表并且表中已經有資料之後,如果你要移動表資料,隻能通過聚集索引這個中介來移動表資料
從下圖可以看出資料都已經移動到E:\FG_TestUnique_Id_02_data.ndf檔案上
知識點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檔案組檔案
知識點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掉
移動之前查一下表中的資料在哪個檔案組中
如有不對的地方,歡迎大家拍磚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)
移資料