移動數據:html
一、有表分區數據庫
二、沒有表分區app
我這裏只討論沒有表分區的狀況函數
例子測試
好比:你有三個文件組,其中一個是主文件組spa
測試腳本:.net
1 USE master 2 GO 3 4 5 IF EXISTS(SELECT * FROM sys.[databases] WHERE [database_id]=DB_ID('Test')) 6 DROP DATABASE [Test] 7 8 --1.建立數據庫 9 CREATE DATABASE [Test] 10 GO 11 12 USE [Test] 13 GO 14 15 16 --2.建立文件組 17 ALTER DATABASE [Test] 18 ADD FILEGROUP [FG_Test_Id_01] 19 20 ALTER DATABASE [Test] 21 ADD FILEGROUP [FG_Test_Id_02] 22 23 24 25 --3.建立文件 26 ALTER DATABASE [Test] 27 ADD FILE 28 (NAME = N'FG_TestUnique_Id_01_data',FILENAME = N'E:\FG_TestUnique_Id_01_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB ) 29 TO FILEGROUP [FG_Test_Id_01]; 30 31 ALTER DATABASE [Test] 32 ADD FILE 33 (NAME = N'FG_TestUnique_Id_02_data',FILENAME = N'E:\FG_TestUnique_Id_02_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB ) 34 TO FILEGROUP [FG_Test_Id_02]; 35 36 37 --4.建立表,這個表的數據存放在[FG_Test_Id_01] 文件組上 38 CREATE TABLE aa(id INT ,cname NVARCHAR(4000)) ON [FG_Test_Id_01] 39 GO 40 41 42 --5.插入數據 43 INSERT INTO [dbo].[aa] 44 SELECT 1,REPLICATE('s',3000) 45 GO 500 46 47 48 --6.查詢數據 49 SELECT * FROM [dbo].[aa] 50 51 52 --7.建立彙集索引在[FG_Test_Id_02]文件組上 53 CREATE CLUSTERED INDEX PK_ID ON [dbo].[aa]([id]) WITH(ONLINE=ON) ON [FG_Test_Id_02] 54 GO 55 56 57 --8.咱們查看一下文件組的邏輯文件名 58 EXEC [sys].[sp_helpdb] @dbname = TEST -- sysname 59 60 61 62 --9.收縮一下FG_Test_Id_01文件組文件 63 DBCC SHRINKFILE(FG_TestUnique_Id_01_data,1) 64 65 66 --10.你能夠選擇drop掉彙集索引,也能夠選擇不drop掉彙集索引 67 DROP INDEX PK_ID ON [dbo].[aa] 68 69 USE master 70 GO 71 DROP DATABASE [Test]
上面的腳本雖然簡單,可是隱藏了很是多的知識點code
知識點1:建立了兩個文件組,如今數據庫有三個文件組,包括主文件組,當你不指定任何參數的時候默認建立出來的數據文件是1MB大小htm
知識點2:插入數據,由於表是建立在[FG_Test_Id_01]文件組上,因此數據都會放在E:\FG_TestUnique_Id_01_data.ndfblog
1 CREATE TABLE aa(id INT ,cname NVARCHAR(4000)) ON [FG_Test_Id_01] 2 GO
知識點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] 這種語法上
就是說你一旦建表而且表中已經有數據以後,若是你要移動表數據,只能經過彙集索引這個中介來移動表數據
1 CREATE CLUSTERED INDEX PK_ID ON [dbo].[aa]([id]) WITH(ONLINE=ON) ON [FG_Test_Id_02] 2 GO
從下圖能夠看出數據都已經移動到E:\FG_TestUnique_Id_02_data.ndf文件上
知識點4:爲什麼要加上WITH(ONLINE=ON)??若是你的應用是不能停機的話,加上WITH(ONLINE=ON)就能夠在線的建立索引
詳情參考:CREATE INDEX (Transact-SQL)
1 CREATE CLUSTERED INDEX PK_ID ON [dbo].[aa]([id]) WITH(ONLINE=ON) ON [FG_Test_Id_02] 2 GO
知識點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文件組文件
1 --9.收縮一下FG_Test_Id_01文件組文件 2 DBCC SHRINKFILE(FG_TestUnique_Id_01_data,1)
知識點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掉
移動以前查一下表中的數據在哪一個文件組中
1 USE [Northwind] 2 GO 3 EXEC [sys].[sp_help] @objname = N'[dbo].[Categories]' -- nvarchar(776)
若有不對的地方,歡迎你們拍磚o(∩_∩)o
2014-1-19 補充:
有表分區的方法
大概有三種
先建立新的數據文件,文件組,分區方案,分區函數
例如建立三個新的數據文件和文件組,分區方案和分區函數對於這三個新的數據文件和文件組
舊錶:不管已經分區或者尚未分區都適用下面三種方法:
方法一:創建中間表(新表),中間表創建在新的分區方案上,而後用insert into 新表 select * from 舊錶的方法,插入完畢以後
drop掉舊錶
方法二:創建中間表,中間表創建在新的分區方案上,而後用switch to,由於新分區方案有三個分區
那麼,switch to只可以將表的所有數據切換到其中一個分區
USE Sales GO ALTER TABLE 舊錶 SWITCH PARTITION 1 TO 新表 PARTITION 1 GO
或者
USE Sales GO ALTER TABLE 舊錶 SWITCH PARTITION 1 TO 新表 PARTITION 2 GO
或者
USE Sales GO ALTER TABLE 舊錶 SWITCH PARTITION 1 TO 新表 PARTITION 3 GO
上面的三條語句就會把舊錶的全部數據移動到新表的某個分區,至於移動到哪一個分區由最後那個數字來指定PARTITION 要移動到的分區的數字
完成後drop掉舊錶
方法三:drop掉舊錶的彙集索引(若是有),而後在舊錶上建立一個彙集索引,建立彙集索引的時候指定新的分區方案
這樣就會把表數據移動到新分區方案,即新的數據文件裏,這個方法跟沒有表分區的數據移動是同樣的
參考文章:http://blog.csdn.net/smallfools/article/details/4930810
刪除文件和刪除文件組
--Transact-SQL USE master; GO ALTER DATABASE AdventureWorks2012 REMOVE FILE test1dat3 ; ALTER DATABASE AdventureWorks2012 REMOVE FILE test1dat4 ; GO --Transact-SQL USE master; GO ALTER DATABASE AdventureWorks2012 REMOVE FILEGROUP Test1FG1 ; GO
移數據
-- 備份數據庫 backup database xx to disk =xx DBCC SHRINKFILE(BSDF2017,EMPTYFILE ) ALTER DATABASE AdventureWorks2012 REMOVE FILE BSDF2017 ;