在今天的文章裏,我想談下SQL Server裏很是重要的話題:SQL Server如何處理文件的文件組。當你用CREATE DATABASE命令建立一個簡單的數據庫時,SQL Server爲你建立2個文件:web
數據文件自己在有且只有一個主文件組裏建立。默認狀況下,在主文件組裏,SQL Server存儲素有的數據(用戶表,系統表等)。那有額外的文件和文件組的目的是什麼?咱們來看下。算法
當你爲你的數據建立額外的文件組,你能夠在它們裏面存儲你定義的表和索引,這個會在多個方面幫助你sql
一般,你應該至少有一個從文件組,這裏你能夠存儲你本身建立的數據庫對象。你不該該在主文件組裏存儲SQL Server爲你建立的其餘系統對象。數據庫
當你建立了你本身的文件組,你也要至少放一個文件進去。另外,你能夠增長額外的文件到文件組。這也會提升你的負荷性能,由於SQL Server會散步數據在全部的文件間,即所謂的輪詢調度分配算法(Round Robin Allocation Algorithm)。第一個64K在第一個文件存儲,第二個64k在第二個文件存儲,第三個區在第一個文件存儲(在你的文件組裏,你有2個文件時)。性能
使用這個方法,SQL Server能夠在緩衝池裏閂鎖分配位圖頁(PFS,GAM,SGAM)的多個副本,並提升你的負荷性能。你也能夠用這個方法解決在TempDb裏默認配置的同個問題。另外,SQL Server也會確保文件組的全部文件在同一時間點滿——經過所謂的比例填充算法(Proportional Fill Algorithm)。所以,在文件組裏你的全部文件有一樣的初始大小和自動增加參數很是重要。否則輪詢調度分配算法就不能正常工做。
測試
如今咱們來看下一個實例,如何建立額外文件組裏有多個文件在裏面的數據庫。下列代碼展現了你必須用到的CREATE DATABASE命令來完成這個任務。 spa
-- Create a new database CREATE DATABASE MultipleFileGroups ON PRIMARY ( -- Primary File Group NAME = 'MultipleFileGroups', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.mdf', SIZE = 5MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), -- Secondary File Group FILEGROUP FileGroup1 ( -- 1st file in the first secondary File Group NAME = 'MultipleFileGroups1', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups1.ndf', SIZE = 1MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), ( -- 2nd file in the first secondary File Group NAME = 'MultipleFileGroups2', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups2.ndf', SIZE = 1MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( -- Log File NAME = 'MultipleFileGroups_Log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\MultipleFileGroups.ldf', SIZE = 5MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) GO
建立完數據庫後,問題是如何把表或索引放到特定的文件組?你能夠用ON關鍵字人爲制定文件組,以下代碼所示:日誌
CREATE TABLE Customers ( FirstName CHAR(50) NOT NULL, LastName CHAR(50) NOT NULL, Address CHAR(100) NOT NULL, ZipCode CHAR(5) NOT NULL, Rating INT NOT NULL, ModifiedDate DATETIME NOT NULL, ) ON [FileGroup1] GO
另外一個選項,你標記特定文件組爲默認文件組。而後SQL Server自動建立新的數據庫對象在沒有指定ON關鍵字的文件組裏。code
-- FileGroup1 gets the default filegroup, where new database objects -- will be created ALTER DATABASE MultipleFileGroups MODIFY FILEGROUP FileGroup1 DEFAULT GO
這是我一般推薦的方法,由於你不須要再考慮,在建立完你的數據庫對象後。所以如今讓咱們建立一個新的表,它會自動存儲在FileGroup1文件組。orm
-- The table will be created in the file group "FileGroup1" CREATE TABLE Test ( Filler CHAR(8000) ) GO
如今咱們進行簡單的測試:咱們插入40000條記錄到表。每條記錄8K大小。所以咱們插入了320MB數據到表。這是我剛纔提的輪詢調度分配算法,會進行操做:SQL Server會在2個文件間發放數據:第一個文件有160M的數據,第二個文件也會有160M的數據。
-- Insert 40.000 records, results in about 312MB data (40.000 x 8KB / 1024 = 312,5MB) -- They are distributed in a round-robin fashion between the files in the file group "FileGroup1" -- Each file will get about 160MB DECLARE @i INT = 1 WHILE (@i <= 40000) BEGIN INSERT INTO Test VALUES ( REPLICATE('x', 8000) ) SET @i += 1 END GO
接下來你能夠在硬盤上看下,你會看到2個文件時一樣的大小。
當你把這些文件放在不一樣的物理硬盤上,你能夠同時訪問它們。那就是在一個文件組裏有多個文件的強大。
你也可使用下列腳本獲取數據庫文件的相關信息。
-- Retrieve file statistics information about the created database files DECLARE @dbId INT SELECT @dbId = database_id FROM sys.databases WHERE name = 'MultipleFileGroups' SELECT sys.database_files.type_desc, sys.database_files.physical_name, sys.dm_io_virtual_file_stats.* FROM sys.dm_io_virtual_file_stats ( @dbId, NULL ) INNER JOIN sys.database_files ON sys.database_files.file_id = sys.dm_io_virtual_file_stats.file_id GO
在今天的文章裏我向你展現了多個文件組和文件組裏多個文件是如何讓你的數據庫更容易管理,還有文件組裏的多個文件是如何使用輪詢調度分配算法。
感謝關注!
https://www.sqlpassion.at/archive/2016/08/29/files-and-file-groups-in-sql-server/