SQL Server 2008新特性——FILESTREAM

【出自博客園深藍居,轉載請註明作者出處】

FILESTREAM簡介

FILESTREAM是SQL Server 2008中的一個新特性,允許以獨立文件的形式存放大對象數據,而不是以往一樣將所有數據都保存到數據文件中。以往在對業務系統的文件進行管理時有兩種方法,一種是將文件保存到服務器文件系統中,數據庫中只保存了該文件的路徑,在使用該文件時應用程序連接到服務器讀取文件;另一種是將文件以varbinary(max)或image數據類型保存到SQL Server中。而SQL Server 2008提供了FILESTREAM,結合這兩種方式的優點。

FILESTREAM使SQL Server數據庫引擎和NTFS文件系統成爲了一個整體。Transact-SQL語句可以插入、更新、查詢、搜索和備份FILESTREAM數據。FILESTREAM使用NT系統緩存來緩存文件數據。這有助於減少FILESTREAM數據可能對數據庫引擎性能產生的任何影響。由於沒有使用SQL Server緩衝池,因此該內存可用於查詢處理。

在SQL Server中,BLOB可以是將數據存儲在表中的標準varbinary(max)數據,也可以是將數據存儲在文件系統中的FILESTREAM varbinary(max)對象。數據的大小和應用情況決定您應該使用數據庫存儲還是文件系統存儲。如果滿足以下條件,則應考慮使用FILESTREAM:

  • 所存儲的對象平均大於1MB。
  • 快速讀取訪問很重要。
  • 您開發的是使用中間層作爲應用程序邏輯的應用程序。

對於較小的對象,將varbinary(max)BLOB存儲在數據庫中通常會提供更爲優異的流性能。

FILESTREAM存儲以varbinary(max)列的形式實現,在該列中數據以BLOB的形式存儲在文件系統中。BLOB的大小僅受文件系統容量大小的限制。文件大小爲2GB的varbinary(max)標準限制不適用於存儲在文件系統中的BLOB。

若要將指定列使用FILESTREAM存儲在文件系統中,對varbinary(max)列指定FILESTREAM屬性。這樣數據庫引擎會將該列的所有數據存儲在文件系統,而不是數據庫文件中。

FILESTREAM數據必須存儲在FILESTREAM文件組中。FILESTREAM文件組是包含文件系統目錄而非文件本身的專用文件組。這些文件系統目錄稱爲“數據容器”。數據容器是數據庫引擎存儲與文件系統存儲之間的接口。

使用FILESTREAM存儲時,需要注意以下內容:

  • 如果表包含FILESTREAM列,則每一行都必須具有唯一的行ID。
  • 不能嵌套FILESTREAM數據容器。
  • 使用故障轉移羣集時,FILESTREAM文件組必須位於共享磁盤資源上。
  • FILESTREAM文件組可位於壓縮捲上。

使用FILESTREAM

在開始使用FILESTREAM之前,必須在SQL Server數據庫引擎實例中啓用FILESTREAM。具體啓用數據庫實例FILESTREAM的操作如下:

(1)在SQL Server配置管理器中打開SQL Server數據庫引擎的屬性窗口,切換到FILESTREAM選項卡,如圖所示。

clip_image002

(2)選中“針對Transact-SQL訪問啓用FILESTREAM”複選框,其他的選項是針對Windows進行讀寫的,可以都選中,然後單擊“確定”按鈕保存對FILESTREAM的設置。

(3)打開SSMS連接到數據庫實例,右擊數據庫實例,選擇“屬性”選項,系統將打開SQL Server實例的屬性窗口。

(4)切換的“高級”選項頁,在文件流訪問級別下拉列表框中選擇“已啓用完全訪問”選項,如圖所示。

 clip_image004

(5)單擊“確定”按鈕,然後重啓數據庫實例,FILESTREAM在數據庫實例中設置完成。

在啓用了數據庫實例的FILESTREAM後,接下來就需要設置數據庫的FILESTREAM和創建具有FILESTREAM數據列的表:

(6)對應新建的數據庫,則在創建數據庫時創建FILESTREAM文件組,如果是現有數據庫,則使用ALTER DATABASE添加FILESTREAM的文件組,例如對TestDB1數據庫添加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
複製代碼

系統將自動創建C:\FileStream文件夾並在其中寫入filestream.hdr文件,該文件是 FILESTREAM容器的頭文件不能刪除,一定要確保在運行該語句之前C:\FileStream並不存在。

(7)創建了FILESTREAM文件組後便可創建和修改表,指定某varbinary(max)類型的列包含FILESTREAM數據。例如創建Files表,該表包含FileID和FIleContent列,具體腳本如代碼:

CREATE TABLE Files
(
FileID 
UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,
ID 
INT UNIQUE,
FileContent 
VARBINARY(MAX) FILESTREAM NULL --FILESTREAM類型的二進制
)
管理與使用FILESTREAM

在創建好FILESTREAM表後即可向其中添加、修改和讀取數據。SQL Server支持使用T-SQL和WIN32 API兩種方式訪問FILESTREAM。

對於T-SQL訪問FILESTREAM數據列來說,FILESTREAM是完全透明的,也就是說,T-SQL仍然使用一般的訪問varbinary(max)數據列的方式訪問,並不會因爲是FILESTREAM列而有所不同。

例如向Files表中插入數據、修改表數據和刪除數據的SQL腳本如代碼:

複製代碼
INSERT INTO Files --插入測試數據
VALUES (newid (),1CAST('TestFileStream1' as varbinary(max)));
GO

UPDATE Files --更新測試數據
SET FileContent=CAST('TestFileStream2' as varbinary(max))
WHERE ID=1
GO

DELETE FROM Files --刪除測試數據
WHERE ID=1
複製代碼

無論是插入數據還是修改數據,SQL Server都將在文件系統中創建新的文件來保存最新的修改文件內容,修改或刪除數據後文件系統中的文件將保留,而不會被同時刪除。

使用FILESTREAM來存儲二進制大型對象(BLOB)數據時,可使用Win32 API來處理文件。爲了支持在Win32應用程序中處理FILESTREAMBLOB數據。所有FILESTREAM數據容器訪問都是在SQL Server事務中執行的。可在同一事務中執行T-SQL語句以保持SQL數據和FILESTREAM數據之間的一致性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章