SQL Server 2005中的檔案和檔案組

iSQlServer發表於2010-03-05
1、檔案和檔案組的含義與關係

每個資料庫有一個主資料檔案.和若干個從檔案。檔案是資料庫的物理體現。 檔案組可以包括分佈在多個邏輯分割槽的檔案,實現負載平衡。檔案組允許對檔案進行分組,以便於管理和資料的分配/放置。例如,可以分別在三個硬碟驅動器上創 建三個檔案(Data1.ndf、Data2.ndf 和 Data3.ndf),並將這三個檔案指派到檔案組 fgroup1 中。然後,可以明確地在檔案組 fgroup1 上建立一個表。對錶中資料的查詢將分散到三個磁碟上,因而效能得以提高。在 RAID(磁碟冗餘陣列)條帶集上建立單個檔案也可以獲得相同的效能改善。然而,檔案和檔案組使您得以在新磁碟上輕易地新增新檔案。另外,如果資料庫超過 單個 Microsoft Windows 檔案的最大大小,則可以使用次要資料檔案允許資料庫繼續增長。

2、檔案、檔案組在實踐應用中常見的問題

通常情況下我們構造的資料庫都只有兩個檔案,mdf檔案和ldf檔案.但是這樣有兩個缺點:

(一)容易導致檔案過大

我們知道,mdf檔案是資料庫檔案,這樣的話也就意味著隨著資料庫的增大mdf就會相應的增大,顯然在現在的應用中資料膨脹是太常見的事情了,當你 的應用變大後,mdf檔案也會變大,然而windows對檔案的大小是有要求的,這樣的話很容易導致mdf檔案達到windows所允許的檔案大小的界限 (於是資料庫就崩潰了)。

(二)沒有利用到磁碟陣列

大型的伺服器好多都有磁碟陣列,你可以把磁碟陣列簡單的假象成n個一塊轉動的磁碟,磁碟陣列的設計是希望通過多個磁碟的串聯來得到更大的讀寫效率. 但是如果你的資料庫只有一個mdf檔案(ldf檔案暫時不考慮),那麼你總是隻能夠利用這個磁碟陣列裡面的一個磁碟而已.那樣的話昂貴的磁碟陣列的效率就 由並聯變成串聯了.試想如果我們能夠讓mdf分散成多個檔案,比如說磁碟陣列上的每個磁碟中都分配一個檔案,然後把mdf中的資料分散到各個檔案中,我在 讀取的時候就是串聯的讀取了,這樣就充分的利用了磁碟陣的存取效能.

這兩個問題平常我們沒有遇到過(條件不具備),但是做大型的服務開發的時候這幾乎是致命的.

3、查詢檔案組和檔案語句

這在2005下,執行

SELECT df.[name],
df.physical_name,
df.[size],
df.growth,
f.[name][filegroup],
f.is_default
FROM sys.database_files df JOIN sys.filegroups f
ON df.data_space_id = f.data_space_id

4、MSDN官方解釋

瞭解檔案和檔案組

每個 SQL Server 資料庫至少具有兩個作業系統檔案:一個資料檔案和一個日誌檔案。資料檔案包含資料和物件,例如表、索引、儲存過程和檢視。日誌檔案包含恢復資料庫中的所有事務所需的資訊。為了便於分配和管理,可以將資料檔案集合起來,放到檔案組中。

à資料庫檔案
SQL Server 資料庫具有三種型別的檔案,如下所示

主要資料檔案

主要資料檔案包含資料庫的啟動資訊,並指向資料庫中的其他檔案。使用者資料和物件可儲存在此檔案中,也可以儲存在次要資料檔案中。每個資料庫有一個主要資料檔案。主要資料檔案的建議副檔名是 .mdf.
次要資料檔案

是可選的,由使用者定義並儲存使用者資料。通過將每個檔案放在不同的磁碟驅動器上,次要檔案可用於將資料分散到多個磁碟上。另外,如果資料庫超過了單個 Windows 檔案的最大大小,可以使用次要資料檔案,這樣資料庫就能繼續增長。次要資料檔案的建議副檔名是 .ndf。
事務日誌檔案
事務日誌檔案儲存用於恢復資料庫的日誌資訊。每個資料庫必須至少有一個日誌檔案。事務日誌的建議副檔名是 .ldf.

à檔案組
每個資料庫有一個主要檔案組。此檔案組包含主要資料檔案和未放入其他檔案組的所有次要檔案。可以建立使用者定義的檔案組,用於將資料檔案集合起來,以便於管理、資料分配和放置。

例如,可以分別在三個磁碟驅動器上建立三個檔案 Data1.ndf、Data2.ndf 和 Data3.ndf,然後將它們分配給檔案組 fgroup1。然後,可以明確地在檔案組 fgroup1 上建立一個表。對錶中資料的查詢將分散到三個磁碟上,從而提高了效能。通過使用在 RAID(獨立磁碟冗餘陣列)條帶集上建立的單個檔案也能獲得同樣的效能提高。但是,檔案和檔案組使您能夠輕鬆地在新磁碟上新增新檔案。

以下列出了儲存在檔案組中的所有資料檔案。

主檔案組
主要包含主要檔案的檔案組。所有系統表都被分配到主要檔案組中。
使用者定義檔案組

使用者首次建立資料庫或以後修改資料庫時明確建立的任何檔案組

預設檔案組
如果在資料庫中建立物件時沒有指定物件所屬的檔案組,物件將被分配給預設檔案組。不管何時,只能將一個檔案組指定為預設檔案組。預設檔案組中的檔案必須足夠大,能夠容納未分配給其他檔案組的所有新物件。

PRIMARY 檔案組是預設檔案組,除非使用 ALTER DATABASE 語句進行了更改。但系統物件和表仍然分配給 PRIMARY 檔案組,而不是新的預設檔案組。

5、操作例項

--(5.1)建立資料庫
--切換到 master 資料庫
USE master
GO
create database db_Study
on primary --主檔案組和主要資料檔案
(name='db_study_Primary',
filename='D:\study\db_study_pri.mdf'),
filegroup db_Study_filegroup1 --使用者定義檔案組1
(name='db_study_fg_data1',
filename='D:\study\db_study_fg_data1_1.ndf'),--次要資料檔案1
(name='db_study_fg_data2' ,
filename='D:\study\db_study_fg_data2_2.ndf'),--次要資料檔案2
filegroup db_Study_filegroup2
(name='db_study_fg_data3',
filename='D:\study\db_study_fg_data3_1.ndf')
log on
(name='db_study_log',
filename='D:\study\db_study.ldf')
go
--5.2查詢檔案組和檔案
SELECT df.[name],
df.physical_name,
df.[size],
df.growth,
f.[name][filegroup],
f.is_default
FROM sys.database_files df JOIN sys.filegroups f
ON df.data_space_id = f.data_space_id
/*
name physical_name size growth filegroup is_default
db_study_Primary D:\study\db_study_pri.mdf 280 128 PRIMARY 1
db_study_fg_data1 D:\study\db_study_fg_data1_1.ndf 128 128 db_Study_filegroup1 0
db_study_fg_data2 D:\study\db_study_fg_data2_2.ndf 128 128 db_Study_filegroup1 0
db_study_fg_data3 D:\study\db_study_fg_data3_1.ndf 128 128 db_Study_filegroup2 0
*/

--5.3修改預設資料檔案組
alter database db_study
modify filegroup db_study_filegroup1 default
--5.4
--在預設檔案組db_study_filegroup1建立表,
--並且指定影像資料儲存在使用者定義檔案組db_study_filegroup1
create table my_test
(
ID int primary key,
[Name] varchar(10),
PIC image
)textimage_on db_study_filegroup2
--在使用者定義檔案組db_study_filegroup2上建立索引
create index ix_my_test on my_test(ID) on db_study_filegroup2
GO
--5.5將要刪除資料檔案db_study_fg_data1的資料轉移到其他資料檔案中,
--並且清空資料檔案db_study_fg_data1
DBCC SHRINKFILE(db_study_fg_data1,EMPTYFILE)
go
--刪除資料檔案db_study_fg_data1
ALTER DATABASE DB_study
REMOVE FILE db_study_fg_data1
go

作者:wufeng4552 部落格:http://blog.csdn.net/wufeng4552

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-628721/,如需轉載,請註明出處,否則將追究法律責任。

相關文章