SQL Server 2008新特性——FILESTREAM
FILESTREAM簡介
FILESTREAM是SQL Server 2008中的一個新特性,允許以獨立文件的形式存放大對象數(shù)據(jù),而不是以往一樣將所有數(shù)據(jù)都保存到數(shù)據(jù)文件中。以往在對業(yè)務(wù)系統(tǒng)的文件進行管理時有兩種方法,一種是將文件保存到服務(wù)器文件系統(tǒng)中,數(shù)據(jù)庫中只保存了該文件的路徑,在使用該文件時應(yīng)用程序連接到服務(wù)器讀取文件;另一種是將文件以varbinary(max)或image數(shù)據(jù)類型保存到SQL Server中。而SQL Server 2008提供了FILESTREAM,結(jié)合這兩種方式的優(yōu)點。
FILESTREAM使SQL Server數(shù)據(jù)庫引擎和NTFS文件系統(tǒng)成為了一個整體。Transact-SQL語句可以插入、更新、查詢、搜索和備份FILESTREAM數(shù)據(jù)。FILESTREAM使用NT系統(tǒng)緩存來緩存文件數(shù)據(jù)。這有助于減少FILESTREAM數(shù)據(jù)可能對數(shù)據(jù)庫引擎性能產(chǎn)生的任何影響。由于沒有使用SQL Server緩沖池,因此該內(nèi)存可用于查詢處理。
在SQL Server中,BLOB可以是將數(shù)據(jù)存儲在表中的標(biāo)準(zhǔn)varbinary(max)數(shù)據(jù),也可以是將數(shù)據(jù)存儲在文件系統(tǒng)中的FILESTREAM varbinary(max)對象。數(shù)據(jù)的大小和應(yīng)用情況決定您應(yīng)該使用數(shù)據(jù)庫存儲還是文件系統(tǒng)存儲。如果滿足以下條件,則應(yīng)考慮使用FILESTREAM:
◆ 所存儲的對象平均大于1MB。
◆ 快速讀取訪問很重要。
◆ 您開發(fā)的是使用中間層作為應(yīng)用程序邏輯的應(yīng)用程序。
對于較小的對象,將varbinary(max)BLOB存儲在數(shù)據(jù)庫中通常會提供更為優(yōu)異的流性能。
FILESTREAM存儲以varbinary(max)列的形式實現(xiàn),在該列中數(shù)據(jù)以BLOB的形式存儲在文件系統(tǒng)中。BLOB的大小僅受文件系統(tǒng)容量大小的限制。文件大小為2GB的varbinary(max)標(biāo)準(zhǔn)限制不適用于存儲在文件系統(tǒng)中的BLOB。
若要將指定列使用FILESTREAM存儲在文件系統(tǒng)中,對varbinary(max)列指定FILESTREAM屬性。這樣數(shù)據(jù)庫引擎會將該列的所有數(shù)據(jù)存儲在文件系統(tǒng),而不是數(shù)據(jù)庫文件中。
FILESTREAM數(shù)據(jù)必須存儲在FILESTREAM文件組中。FILESTREAM文件組是包含文件系統(tǒng)目錄而非文件本身的專用文件組。這些文件系統(tǒng)目錄稱為“數(shù)據(jù)容器”。數(shù)據(jù)容器是數(shù)據(jù)庫引擎存儲與文件系統(tǒng)存儲之間的接口。
使用FILESTREAM存儲時,需要注意以下內(nèi)容:
◆ 如果表包含F(xiàn)ILESTREAM列,則每一行都必須具有唯一的行ID。
◆ 不能嵌套FILESTREAM數(shù)據(jù)容器。
◆ 使用故障轉(zhuǎn)移群集時,F(xiàn)ILESTREAM文件組必須位于共享磁盤資源上。
◆ FILESTREAM文件組可位于壓縮卷上。
使用FILESTREAM
在開始使用FILESTREAM之前,必須在SQL Server數(shù)據(jù)庫引擎實例中啟用FILESTREAM。具體啟用數(shù)據(jù)庫實例FILESTREAM的操作如下:
(1)在SQL Server配置管理器中打開SQL Server數(shù)據(jù)庫引擎的屬性窗口,切換到FILESTREAM選項卡,如圖所示:
(2)選中“針對Transact-SQL訪問啟用FILESTREAM”復(fù)選框,其他的選項是針對Windows進行讀寫的,可以都選中,然后單擊“確定”按鈕保存對FILESTREAM的設(shè)置。
(3)打開SSMS連接到數(shù)據(jù)庫實例,右擊數(shù)據(jù)庫實例,選擇“屬性”選項,系統(tǒng)將打開SQL Server實例的屬性窗口。
(4)切換的“高級”選項頁,在文件流訪問級別下拉列表框中選擇“已啟用完全訪問”選項,如圖所示:
#p#
(5)單擊“確定”按鈕,然后重啟數(shù)據(jù)庫實例,F(xiàn)ILESTREAM在數(shù)據(jù)庫實例中設(shè)置完成。
在啟用了數(shù)據(jù)庫實例的FILESTREAM后,接下來就需要設(shè)置數(shù)據(jù)庫的FILESTREAM和創(chuàng)建具有FILESTREAM數(shù)據(jù)列的表:
(6)對應(yīng)新建的數(shù)據(jù)庫,則在創(chuàng)建數(shù)據(jù)庫時創(chuàng)建FILESTREAM文件組,如果是現(xiàn)有數(shù)據(jù)庫,則使用ALTER DATABASE添加FILESTREAM的文件組,例如對TestDB1數(shù)據(jù)庫添加FILESTREAM的文件組,具體SQL腳本如代碼:
ALTER DATABASE [TestDB1] ADD FILEGROUP [FileStreamGroup] CONTAINS FILESTREAM --添加FILESTREAM文件組 GO ALTER DATABASE [TestDB1] ADD FILE ( NAME = N'FileStream', FILENAME = N'C:\FileStream) --添加FILESTREAM文件 TO FILEGROUP [FileStreamGroup] GO |
系統(tǒng)將自動創(chuàng)建C:\FileStream文件夾并在其中寫入filestream.hdr文件,該文件是 FILESTREAM容器的頭文件不能刪除,一定要確保在運行該語句之前C:\FileStream并不存在。
(7)創(chuàng)建了FILESTREAM文件組后便可創(chuàng)建和修改表,指定某varbinary(max)類型的列包含F(xiàn)ILESTREAM數(shù)據(jù)。例如創(chuàng)建Files表,該表包含F(xiàn)ileID和FIleContent列,具體腳本如代碼:
CREATE TABLE Files |
管理與使用FILESTREAM
在創(chuàng)建好FILESTREAM表后即可向其中添加、修改和讀取數(shù)據(jù)。SQL Server支持使用T-SQL和WIN32 API兩種方式訪問FILESTREAM。
對于T-SQL訪問FILESTREAM數(shù)據(jù)列來說,F(xiàn)ILESTREAM是完全透明的,也就是說,T-SQL仍然使用一般的訪問varbinary(max)數(shù)據(jù)列的方式訪問,并不會因為是FILESTREAM列而有所不同。
例如向Files表中插入數(shù)據(jù)、修改表數(shù)據(jù)和刪除數(shù)據(jù)的SQL腳本如代碼:
INSERT INTO Files --插入測試數(shù)據(jù) UPDATE Files --更新測試數(shù)據(jù) DELETE FROM Files --刪除測試數(shù)據(jù) |
無論是插入數(shù)據(jù)還是修改數(shù)據(jù),SQL Server都將在文件系統(tǒng)中創(chuàng)建新的文件來保存***的修改文件內(nèi)容,修改或刪除數(shù)據(jù)后文件系統(tǒng)中的文件將保留,而不會被同時刪除。
使用FILESTREAM來存儲二進制大型對象(BLOB)數(shù)據(jù)時,可使用Win32 API來處理文件。為了支持在Win32應(yīng)用程序中處理FILESTREAMBLOB數(shù)據(jù)。所有FILESTREAM數(shù)據(jù)容器訪問都是在SQL Server事務(wù)中執(zhí)行的。可在同一事務(wù)中執(zhí)行T-SQL語句以保持SQL數(shù)據(jù)和FILESTREAM數(shù)據(jù)之間的一致性。
【編輯推薦】