在SQL Server中對表進行分區管理時,必定涉及到文件與文件組,關於文件與文件組如何創建在網上資料很多,我博客里也有兩篇相關轉載文件,可以看看,我這就不再細述,這里主要講幾個一般網上很少講到的東西,但有時候卻很重要。
前面內容主要摘自SQL的聯機幫助:
1、一個文件或文件組不能由多個數據庫使用。例如,任何其他數據庫都不能使用包含 sales 數據庫中的數據和對象的文件 sales.mdf 和 sales.ndf。
2、一個文件只能是一個文件組的成員。
3、一個文件組可以包含多個文件,一個數據表在創建時可以指定要將數據放在那一個文件組上,而沒有辦法指定是要放在哪一個文件上,文件組對組內的所有文件都使用按比例填充策略。
4、事務日志文件不能屬於任何文件組。
使用文件和文件組時的一些一般建議:
-
大多數數據庫在只有單個數據文件和單個事務日志文件的情況下性能良好。
-
如果使用多個文件,請為附加文件創建第二個文件組,並將其設置為默認文件組。這樣,主文件將只包含系統表和對象。
-
若要使性能最大化,請在盡可能多的不同的可用本地物理磁盤上創建文件或文件組。將爭奪空間最激烈的對象置於不同的文件組中。
-
使用文件組將對象放置在特定的物理磁盤上。
-
將在同一聯接查詢中使用的不同表置於不同的文件組中。由於采用並行磁盤 I/O 對聯接數據進行搜索,所以性能將得以改善。
-
將最常訪問的表和屬於這些表的非聚集索引置於不同的文件組中。如果文件位於不同的物理磁盤上,由於采用並行 I/O,所以性能將得以改善。
-
請勿將事務日志文件置於其中已有其他文件和文件組的物理磁盤上。
文件組對組內的所有文件都使用按比例填充策略的解析:
當數據寫入文件組時,SQL Server 數據庫引擎按文件中的可用空間比例將數據寫入文件組中的每個文件,而不是將所有數據都寫入第一個文件直至其變滿為止。然后再寫入下一個文件。例如,如果文件 f1 有 100 MB 可用空間,文件 f2 有 200 MB 可用空間,則從文件 f1 中分配一個區,從文件 f2 中分配兩個區,依此類推。這樣,兩個文件幾乎同時填滿,並且可獲得簡單的條帶化。
假定將數據庫設置為自動增長,則當文件組中的所有文件填滿后,數據庫引擎便會采用循環方式一次自動擴展一個文件以容納更多數據。例如,某個文件組由三個文件組成,它們都設置為自動增長。當文件組中所有文件的空間都已用完時,只擴展第一個文件。當第一個文件已滿,無法再向文件組中寫入更多數據時,將擴展第二個文件。當第二個文件已滿,無法再向文件組中寫入更多數據時,將擴展第三個文件。當第三個文件已滿,無法再向文件組中寫入更多數據時,將再次擴展第一個文件,依此類推
自己實踐過程摸索的內容:
文件與文件組的刪除,如果因為以前的分區方案不合理,需要取消分區,或者按另外一種方式分區,就需要涉及到文件與文件組的刪除操作,如果沒有掌握正確步驟,有時候可能無法刪除,會提示你“文件不為空,無法刪除”或者“文件組不為空,不能刪除”等等,如果不知道技巧,會很郁悶!本人就曾經經歷過這樣的郁悶!在百度也沒找到正確答案,下面說說我自己經過摸索后得到的答案。
1、 文件的刪除:首先要先清空文件里的數據,刪除之前數據一定要記得先備份,可將數據復制到其他表,然后執行:
DBCC SHRINKFILE (FileName, EMPTYFILE);
文件中的內容刪除后,再執行刪除文件命令,DataBaseName表示數據名,FileName 表示文件名:
ALTER DATABASE [DataBaseName] REMOVE FILE FileName;
2、文件組的刪除:
當文件組的文件被刪除后,按正常理解,應該就可以直接刪除文件組,實際是不行的,你無法刪除文件組。
因為還有幾個東西依賴文件組,一是分區方案,二是使用該分區方案的分區表。
所以要刪除分區方案才能刪除文件組。但要刪除分區方案之前要先更改依賴它的分區表,使其不依賴它。
這個主要是更改分區表的分區列,使其不使用分區方案,如果實在不會更改,在表里數據已經備份的前提下,可以直接刪除表來解決。
然后再刪除分區表方案,最后就可以直接刪除文件組了。
總結前面的刪除過程:
1、修改分區表,使其不依賴分區方案。
2、刪除分區方案(依賴要刪除的文件組)。
DROP PARTITION SCHEME [Part_func_scheme_Name]
3、直接刪除文件組。
ALTER DATABASE [DataBaseName] REMOVE FILEGROUP [FGName]
DataBaseName表示數據名,FGName 表示文件組名。