原文:
sql server裡的檔案和檔案組
在今天的文章裡,我想談下sql server裡非常重要的話題:sql server如何處理檔案的檔案組。當你用create database命令建立乙個簡單的資料庫時,sql server為你建立2個檔案:
資料檔案本身在有且只有乙個主檔案組裡建立。預設情況下,在主檔案組裡,sql server儲存素有的資料(使用者表,系統表等)。那有額外的檔案和檔案組的目的是什麼?我們來看下。
當你為你的資料建立額外的檔案組,你可以在它們裡面儲存你定義的表和索引,這個會在多個方面幫助你
通常,你應該至少有乙個從檔案組,這裡你可以儲存你自己建立的資料庫物件。你不應該在主檔案組裡儲存sql server為你建立的其他系統物件。
當你建立了你自己的檔案組,你也要至少放乙個檔案進去。另外,你可以增加額外的檔案到檔案組。這也會提高你的負荷效能,因為sql server會散步資料在所有的檔案間,即所謂的輪詢排程分配演算法(round robin allocation algorithm)。第乙個64k在第乙個檔案儲存,第二個64k在第二個檔案儲存,第三個區在第乙個檔案儲存(在你的檔案組裡,你有2個檔案時)。
使用這個方法,sql server可以在緩衝池裡閂鎖分配點陣圖頁(pfs,gam,sgam)的多個副本,並提高你的負荷效能。你也可以用這個方法解決在tempdb裡預設配置的同個問題。另外,sql server也會確保檔案組的所有檔案在同一時間點滿——通過所謂的比例填充演算法(proportional fill algorithm)。因此,在檔案組裡你的所有檔案有同樣的初始大小和自動增長引數非常重要。不然輪詢排程分配演算法就不能正常工作。
現在我們來看下乙個例項,如何建立額外檔案組裡有多個檔案在裡面的資料庫。下列**展示了你必須用到的create database命令來完成這個任務。
--建立完資料庫後,問題是如何把錶或索引放到特定的檔案組?你可以用on關鍵字人為制定檔案組,如下**所示: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
)logon(
--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
create另乙個選項,你標記特定檔案組為預設檔案組。然後sql server自動建立新的資料庫物件在沒有指定on關鍵字的檔案組裡。table
customers
( firstname
char(50) not
null
, lastname
char(50) not
null
, address
char(100) not
null
, zipcode
char(5) not
null
, rating
intnot
null
, modifieddate
datetime
notnull,)
on[filegroup1
]go
--這是我通常推薦的方法,因為你不需要再考慮,在建立完你的資料庫物件後。因此現在讓我們建立乙個新的表,它會自動儲存在filegroup1檔案組。filegroup1 gets the default filegroup, where new database objects
--will be created
alter
database multiplefilegroups modify filegroup filegroup1 default
go
--現在我們進行簡單的測試:我們插入40000條記錄到表。每條記錄8k大小。因此我們插入了320mb資料到表。這是我剛才提的輪詢排程分配演算法,會進行操作:sql server會在2個檔案間發放資料:第乙個檔案有160m的資料,第二個檔案也會有160m的資料。the table will be created in the file group "filegroup1"
create
table
test
( filler
char(8000))
go
--接下來你可以在硬碟上看下,你會看到2個檔案時同樣的大小。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
@iint=1
while (@i
<=
40000
)begin
insert
into test values
(
replicate('
x', 8000
) )
set@i+=1
endgo
當你把這些檔案放在不同的物理硬碟上,你可以同時訪問它們。那就是在乙個檔案組裡有多個檔案的強大。
你也可以使用下列指令碼獲取資料庫檔案的相關資訊。
--在今天的文章裡我向你展示了多個檔案組和檔案組裡多個檔案是如何讓你的資料庫更容易管理,還有檔案組裡的多個檔案是如何使用輪詢排程分配演算法。retrieve file statistics information about the created database files
declare
@dbid
intselect
@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
感謝關注!
SQL Server裡的檔案和檔案組
原文 sql server裡的檔案和檔案組 在今天的文章裡,我想談下sql server裡非常重要的話題 sql server如何處理檔案的檔案組。當你用create database命令建立乙個簡單的資料庫時,sql server為你建立2個檔案 資料檔案本身在有且只有乙個主檔案組裡建立。預設情況...
SQL Server 檔案和檔案組
在sql server中,資料庫在硬碟上的儲存方式和普通檔案在windows中的儲存方式沒有什麼不同,僅僅是幾個檔案而已。sql server通過管理邏輯上的檔案組的方式來管理檔案。sql server通過檔案組對資料檔案進行管理。我們看到的邏輯資料庫由乙個或者多個檔案組構成。結構圖如下 檔案組管理...
SQL Server 檔案和檔案組
資料庫是資料的倉庫,用於儲存資料,而儲存資料需要媒介,現在的儲存媒介,最常用的是硬碟,土豪一點的伺服器使用固態硬碟 ssd 特殊用途的伺服器使用記憶體。資料庫最常用的儲存檔案是資料檔案和日誌檔案,資料檔案用於儲存資料,由乙個主資料檔案 mdf 和若干個輔助資料檔案 ndf 構成 日誌檔案用於儲存事物...