SQL Server裏的文件和文件組

在今天的文章裏,我想談下SQL Server裏很是重要的話題:SQL Server如何處理文件的文件組。當你用CREATE DATABASE命令建立一個簡單的數據庫時,SQL Server爲你建立2個文件:web

  • 一個數據文件(.mdf)
  • 一個事務日誌文件(.ldf)

數據文件自己在有且只有一個主文件組裏建立。默認狀況下,在主文件組裏,SQL Server存儲素有的數據(用戶表,系統表等)。那有額外的文件和文件組的目的是什麼?咱們來看下。算法

多個文件組

當你爲你的數據建立額外的文件組,你能夠在它們裏面存儲你定義的表和索引,這個會在多個方面幫助你sql

  • 你能夠保持你的主文件組很小。
  • 你能夠把你的數據分割到多個文件組(例如,你能夠在企業版裏使用文件分區)。
  • 你能夠在文件組級別進行備份和還原操做。這給你在你的備份和還原策略上更多細粒度的控制。
  • 你能夠在文件組級別運行DBCC CHECKDB命令,而不是數據庫級別。

一般,你應該至少有一個從文件組,這裏你能夠存儲你本身建立的數據庫對象。你不該該在主文件組裏存儲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/

相關文章
相關標籤/搜索