SQLServer文件組(一)數據庫
使用文件組開發數據庫的好處佈局
使用文件組開發數據庫能夠改善數據庫的性能。性能
首先,文件組容許跨多個磁盤、多個磁盤控制器或RAID(獨立磁盤冗餘陣列)系統建立數據庫。例如,若是你的計算機上有四個磁盤,在每一個磁盤上放一個文件,那麼你能夠建立一個由三個數據文件和一個日誌文件組成的數據庫。當用戶對數據進行訪問時,磁盤上的四個讀/寫磁頭能夠同時並行地訪問數據。這一動做加快了數據庫操做的速度。大數據
其次,文件組容許數據佈局,便可以在特定文件組中建立表。例如,咱們設計的數據庫中總有常訪問的表和不常訪問的表。能夠將常訪問的表放在一個文件組的一個文件中,且該文件位於一個磁盤上。將不常訪問的表放在另外一個文件組的一個文件中,且該文件位於另外一個磁盤上。這樣能夠將特定表的因此輸入輸出(I/O)都定向到一個特定的磁盤,竟而改善性能。spa
再次,利於實現備份和還原策略。能夠經過稱爲段落還原的進程分階段還起因多個文件組組成的數據庫。段落還原適用於全部恢復模式,但在完整恢復模式和大容量日誌恢復模式下比在簡單恢復模式下更靈活。段落還原方案包括還原的所有三個階段:數據複製、重作或前滾以及撤消或後滾。當使用多個文件組時,能夠分別備份和還原數據庫中的文件。在簡單恢復模式下,只能對只讀文件進行文件備份。使用文件備份使您可以只還原損壞的文件,而不用還原數據庫的其他部分,從而加快了恢復速度。例如,若是一個數據庫由幾個分別位於不一樣的物理磁盤上的文件組成,當其中一個磁盤發生故障時,只需還原發生故障的磁盤上的文件。操作系統
SQLServer文件組(二)設計
文件和文件組概念日誌
SQL Server 將數據庫映射爲一組操做系統文件。數據和日誌信息毫不會混合在同一個文件中,並且一個文件只由一個數據庫使用。文件組是命名的文件集合,用於幫助數據佈局 和管理任務,例如備份和還原操做。對象
數據庫文件索引
SQL Server 數據庫具備三種類型的文件:
主數據文件
主數據文件是數據庫的起點,指向數據庫中的其餘文件。每一個數據庫都有一個主數據文件。主數據文件的推薦文件擴展名是 .mdf。
次要數據文件
除主數據文件之外的全部其餘數據文件都是次要數據文件。某些數據庫可能不含有任何次要數據文件,而有些數據庫則含有多個次要數據文件。次要數據文件的推薦 文件擴展名是 .ndf。
日誌文件
日誌文件包含着用於恢復數據庫的全部日誌信息。每一個數據庫必須至少有一個日誌文件,固然也能夠有多個。日誌文件的推薦文件擴展名是 .ldf。
SQL Server 不強制使用 .mdf、.ndf 和 .ldf 文件擴展名,但使用它們有助於標識文件的各類類型和用途。
數據文件頁
SQL Server 數據文件中的頁按順序編號,文件的首頁以 0 開始。數據庫中的每一個文件都有一個惟一的文件 ID 號。若要惟一標識數據庫中的頁,須要同時使用文件 ID 和頁碼。
每一個文件的第一頁是一個包含有關文件屬性信息的文件的頁首頁。在文件開始處的其餘幾頁也包含系統信息(例如分配映射)。有一個存儲在主數據文件和第一個日誌文 件中的系統頁是包含數據庫屬性信息的數據庫引導頁。
SQL Server 文件能夠從它們最初指定的大小開始自動增加。在定義文件時,您能夠指定一個特定的增量。每次填充文件時,其大小均按此增量來增加。若是文件組中有多個文 件,則它們在全部文件被填滿以前不會自動增加。填滿後,這些文件會循環增加。
每一個文件還能夠指定一個最大大小。若是沒有指定最大大小,文件 能夠一直增加到用完磁盤上的全部可用空間。若是 SQL Server 做爲數據庫嵌入某應用程序,而該應用程序的用戶沒法迅速與系統管理員聯繫,則此功能就特別有用。用戶可使文件根據須要自動增加,以減輕監視數據庫中的可 用空間和手動分配額外空間的管理負擔。
數據庫文件組
能夠在首次建立數據庫時建立文件組,也能夠在之後在數據庫中添加更多文件時建立文件組。可是,一旦將文件添加到數據庫中,就不能再將這些文件移到其 他文件組中。
最多能夠爲每一個數據庫建立 32,767 個文件組。文件組只能包含數據文件。事務日誌文件不能是文件組的一部分。
文件組不能獨立於數據庫文件建立。文件組是在數據庫中組織文件的一種管理機制。
爲便於分配和管理,能夠將數據庫對象和文件一塊兒分紅文件組。有兩種類型的文件組:
主文件組
主文件組包含主數據文件和任何沒有明確分配給其餘文件組的其餘文件。系統表的全部頁均分配在主文件組中。
用戶定義文件組
用戶定義文件組是經過在 CREATE DATABASE 或 ALTER DATABASE 語句中使用 FILEGROUP 關鍵字指定的任何文件組。
日誌文件不包括在文件組內。日誌空間與數據空間分開管理。
一個文件不能夠是多個文件組的成員。表、索引和大型對象數據能夠與指定的文件組相關聯。在這種狀況下,它們的全部頁將被分配到該文件組,或者對錶和索引進行分區。已分區表和索引的數據被分割爲單元,每一個單元能夠放置在數據庫中的單獨文件組中。
默認文件組
每一個數據庫中均有一個文件組被指定爲默認文件組。若是建立表或索引時未指定文件組,則將假定全部頁都從默認文件組分配。一次只能有一個文件組做爲默認文件組。dbowner 固定數據庫角色成員能夠將默認文件組從一個文件組切換到另外一個。若是沒有指定默認文件組,則將主文件組做爲默認文件組。
若是在數據庫中建立對象時 沒有指定對象所屬的文件組,對象將被分配給默認文件組。無論什麼時候,只能將一個文件組指定爲默認文件組。默認文件組中的文件必須足夠大,可以容納未分配給其 他文件組的全部新對象。
PRIMARY 文件組是默認文件組,除非使用 ALTER DATABASE 語句進行了更改。但系統對象和表仍然分配給 PRIMARY 文件組,而不是新的默認文件組。
SQLServer文件組(三)
文件和文件組的填充
文件組對組內的全部文件都使用按比例填充策略。當數據寫入文件組時,SQL Server 數據庫引擎按文件中的可用空間比例將數據寫入文件組中的每一個文件,而不是將全部數據都寫入第一個文件直至其變滿爲止。而後再寫入下一個文件。例如,若是文 件 f1 有 100 MB 可用空間,文件 f2 有 200 MB 可用空間,則從文件 f1 中分配一個區,從文件 f2 中分配兩個區,依此類推。這樣,兩個文件幾乎同時填滿,而且可得到簡單的條帶化。
假定將數據庫設置爲自動增加,則當文件組中的全部文件填滿後,數據庫引擎便 會採用循環方式一次自動擴展一個文件以容納更多數據。例如,某個文件組由三個文件組成,它們都設置爲自動增加。當文件組中全部文件的空間都已用完時,只擴展第一個文件。當第一個文件已滿,沒法再向文件組中寫入更多數據時,將擴展第二個文件。當第二個文件已滿,沒法再向文件組中寫入更多數據時,將擴展第三個文件。當第三個文件已滿,沒法再向文件組中寫入更多數據時,將再次擴展第一個文件,依此類推。
使用文件和文件組管理數據庫增加
建立數據庫時,必須指定數據和日誌 文件的初始大小,或採用默認大小。隨着數據不斷地添加到數據庫,這些文件將逐漸變滿。然而,若是添加到數據庫中的數據多於文件的容量,就須要考慮數據庫在 超過所分配初始空間的狀況下是否增加以及如何增加。
默認狀況下,數據文件根據須要一直增加,直到沒有剩餘的磁盤空間。所以,若是不但願數據 庫文件的大小增加到大於建立時的初始值,則必須在使用 SQL Server Management Studio 或 CREATE DATABASE 語句建立數據庫時指定其大小。
另外,SQL Server 使您能夠建立在填充數據時可以自動增加的數據文件,但只能增加到預約義的最大值。這能夠防止徹底耗盡磁盤驅動器的空間。
建議
在建立數據庫時,請根據數據庫中預期的最大數據量,建立儘量大的數據文 件。容許數據文件自動增加,但要有必定的限度。爲此,須要指定數據文件增加的最大值,以便在硬盤上留出一些可用空間。這樣即可以使數據庫在添加超過預期的 數據時增加,而不會填滿磁盤驅動器。若是已經超過了初始數據文件的大小而且文件開始自動增加,則從新計算預期的數據庫大小最大值。而後,根據計劃添加更多 的磁盤空間,若是須要,在數據庫中建立並添加更多的文件或文件組。
然而,若是假定不使數據庫增加到超過其初始值,請將數據庫增加的最大值設置 爲零。這將防止數據庫文件增加。若是數據庫文件已填滿數據,那麼只有爲數據庫添加更多的數據文件或擴展示有的文件後,才能添加更多的數據。
文件碎片
若是若干文件共享同一個磁盤,則讓文件自動增加可能會致使那些文件產生碎 片。所以,應儘量的在不一樣的本地物理磁盤上建立文件或文件組。此外,還要將爭奪空間最激烈的對象放置在不一樣的文件組中。
SQLServer文件組(四)
文件和文件組示例
如下示例在 SQL Server 實例上建立了一個數據庫。該數據庫包括一個主數據文件、兩個用戶定義文件組和一個日誌文件。主數據文件在主文件組中,而用戶定義文件組包含兩個次要數據文 件。ALTER DATABASE 語句將用戶定義文件組指定爲默認文件組。而後經過指定用戶定義文件組來建立表。
--Create the database with the dafault
--data filegroup and a log file.
--Specify the growth increment and
--the max size for the primary data file.
CREATE DATABASE MyDatabase
ON PRIMARY
(
NAME='MyDB_Primary',
FILENAME='d:\...\MyDB_Primary.mdf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
FILEGROUP MyDB_FG1
(
NAME='MyDB_FG1_Data1',
FILENAME='e:\...\MyDB_FG1_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
(
NAME='MyDB_FG1_Data2',
FILENAME='e:\...\MyDB_FG1_Data2.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
FILEGROUP MyDB_FG2
(
NAME='MyDB_FG2_Data1',
FILENAME='f:\...\MyDB_FG2_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
),
(
NAME='MyDB_FG2_Data1',
FILENAME='f:\...\MyDB_FG2_Data1.ndf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
)
LOG ON
(
NAME='MyDB_Log',
FILENAME='g:\...\MyDB_Log.ldf',
SIZE=4MB,
MAXSIZE=10MB,
FILEGROWTH=1MB
)
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP MyDB_FG1 DEFAULT
GO
--Create a table in the user-defined filegroup.
USE MyDatabase
GO
CREATE TABLE MyTable1
(
cola INT PRIMARY KEY,
colb CHAR(8)
)ON MyDB_FG1
GO
CREATE TABLE MyTable2
(
cola INT PRIMARY KEY,
colb CHAR(8)
)ON MyDB_FG2
GO
SQLServer文件組(五)
文件組的設計規則
一個文件或文件組不能由多個數據庫使用。
一個文件只能是一個文件組的成員。
事務日誌文件不能屬於任何文件組。
使用文件和文件組的一些建議:
大多數數據庫在只有單個數據文件和單個事務日誌文件的狀況下性能良好。
若是使用多個文件,請爲附加文件建立第二個文件組,並將其設置爲默認文件組。這樣,主文件將只包含系統表和對象。
若要使性能最大化,請在儘量多的不一樣的可用本地物理磁盤上建立文件或文件組。將爭奪空間最激烈的對象置於不一樣的文件組中。
使用文件組將對象放置在特定的物理磁盤上。
將在同一聯接查詢中使用的不一樣表置於不一樣的文件組中。因爲採用並行磁盤 I/O 對聯接數據進行搜索,因此性能將得以改善。
將最常訪問的表和屬於這些表的非彙集索引置於不一樣的文件組中。若是文件位於不一樣的物理磁盤上,因爲採用並行 I/O,因此性能將得以改善。
請勿將事務日誌文件置於其中已有其餘文件和文件組的物理磁盤上。
SQLServer文件組(六)
只讀文件組和壓縮
文件組能夠標記爲只讀。任何現有的 文件組(主文件組除外)均可以標記爲只讀。不能使用任何方式對標記爲只讀的文件組進行修改。能夠壓縮只讀文件組。
對於不容許修改的表(如歷 史數據),能夠將它們置於文件組中,而後將這些文件組標記爲只讀。這能夠防止意外的更新。
使用只讀用戶定義文件組和只讀數據庫的 NTFS 壓縮
SQL Server 2005 支持只讀用戶定義文件組和只讀數據庫的 NTFS 壓縮。應在下列情形下考慮壓縮只讀數據:
有大量的靜態數據或歷史數據必須限制爲只讀訪問。
磁盤空間有限。
管理注意事項
僅支持 Windows NTFS 壓縮。有關詳細信息,請參閱 Windows NTFS 文件系統文檔。
支持將存儲在只讀用戶定義 (.NDF) 文件組中的用戶數據進行數據壓縮。除非數據庫自身是隻讀的,不然沒法壓縮主文件組和事務日誌。
若要壓縮用戶定義文件組文件,數據庫必須處於離線狀態。
若要壓縮文件或驗證文件的壓縮狀態,請使用 Windows COMPACT 命令或 Windows 資源管理器。有關詳細信息,
沒法壓縮 SQL Server 系統數據庫(如 master、model、msdb、resource 和 tempdb)。
SQL Server 備份和還原操做支持壓縮文件組。無需對備份和還原的實施進行修改。操做系統壓縮對備份和還原操做是透明的。
徹底支持 ALL SELECT 語句和只讀操做。這些語句的執行時間將比非壓縮文件組上相同語句的執行時間長。
若要修改壓縮數據,必須解壓縮文件並將文件組設置爲讀/寫。
只讀數據庫的主文件組和用戶定義文件組都可以壓縮。必須使用 NTFS 壓縮來壓縮關聯文件。
壓縮文件組支持附加數據庫操做。在分離數據庫以前,必須將文件組設置爲只讀。在附加數據庫以前,必須壓縮文件。
輔助文件組壓縮示例
在此示例中,銷售訂單事務從生產數據庫轉移到 SalesArchive(在 只讀、壓縮文件組上存儲的存檔數據庫)。還將間歇性地搜索數據用於銷售分析和預測,但不修改數據。
在爲從生產數據庫移動數據做準備時,數據庫管理員 (DBA) 將在 SalesArchive 上建立一個讀/寫文件組 Sales01。Sales01 位於 NTFS 目錄。
DBA 將從生產數據庫複製銷售訂單事務來將基於 Sales01 文件組建立的表進行存檔。
在 SalesArchive 數據庫爲全部用戶服務後,DBA 將更改數據庫並將 Sales01 文件組設置爲只讀,而後使數據庫處於離線狀態。
DBA 可使用 Windows COMPACT 命令來壓縮 Sales01.ndf 文件。
DBA 使 SalesArchive 數據庫在線。數據現已壓縮,可用於只讀訪問。