2011年4月3日 星期日

啟用與設定SQL Server 2008 新功能 - FileStream

        在前面的單元中有介紹到SQL Server 2012的新功能,就是FileTable的部份,這個功能的底層其實主要是透過FIleSteam,以前我們為了讓資料庫的可用性與輕巧靈活,如果有非結構化的資料大部份不會將資料直接存放在資料庫之中,而會將資料放置在主機上,然後將存放路徑存放在資料庫中,因為一來如果與一般的結構化資料放在一起時,如果使用者查詢時不小心使用了 "*" ,而資料欄位中又有二進位的資料時,容易造成資料撈取過慢,當然這樣的存放方式在日後維護上也不太方便,需要另外管理外部檔案與資料庫中欄位的相依性,所以微軟在SQL Server 2008的時候推出了FileStream,讓資料庫可以更適合用來操作與管理這些非結構化的檔案。

        首先我先介紹FileStream為何,FileStream本身會將SQL ServerNTFS檔案系統進行整合,而存放方式主要透過barbinary(max)為型態存放在資料庫中,再轉為二進位大型物件(BLOB)資料儲存在檔案系統上。而透過Transact-SQL陳述式可以做到Insert、update、delete、select及備份FileStream資料。而且也可以透過Win32檔案系統介面的方式進行資料流的存取。

         而FileStream會使用NT系統快取來儲存檔案資料,藉以減少FileStream資料可能對Database Engine效能的影響。而且也不會使用到SQL Server的緩衝集區,因此記憶體可以有效的用於查詢處理。

    在下列的情況下,建議可以使用FileStream:
  1. 平均來說,儲存的物件大於 1 MB。
  2. 快速讀取權非常重要。
  3. 您正在開發將中介層用於應用程式邏輯的應用程式。
     再來我就來介紹如何啟用FileStream,你可以透過 【啟動】 -> 【所有程式】 -> 【SQL Server 2008】-> 【Configuration Tools】 -> 【SQL Server Configuration Manager】


  • Enable FileStream for transact-sql access : 是否啟用透過T/SQL存取FilesStream
  • Enable FileStream for File I/O streaming access : 是否啟用Windows讀取或寫 入FilesStream。
  • All remote clients to have streaming access to file stream data : 是否啟用遠端使用者存取FileStream的權限。

     完成上述動作後,開啟SQL Server Management Studio,輸入下列語法即可。


   1: EXEC sp_configure filestream_access_level, 2 
      -- 0 : Disable , 1 : Transact Sql Access , 2 : Win IO Access

   2: GO

   3: RECONFIGURE

   4: GO



     完成後的訊息視窗:




  
完成上述的設定後,開始就來測試FileStreamDatabase的支援測試,可以透過下列的T-SQL建立一個新的Database,建立完成後,你可以透過 [Database] -> [Properties],在 [Files] 與 [FileGroups]  中看到對於FileStream中的支援。

CREATE DATABASE cary_db
ON
PRIMARY ( NAME = carydb_1,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb.mdf'),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = carydb_2,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb_Stream')
LOG ON ( NAME = carydb_log,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\carydb.ldf')
GO




        在最後我就實際的建立一個資料表,用來儲存檔案當成最後的結尾,我會在另一篇的文章中,再來介紹實際的用法。

CREATE TABLE [dbo].[cary_files](
    [sn] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
    [systemid] [int] NOT NULL,
    [filedata] [varbinary](max) FILESTREAM NULL
) ON [PRIMARY]
GO

4 則留言:

  1. 請問 如果目前 資料庫未開啟此功能,在開啟後
    現有資料庫 是否就可已有此功能
    或是 需新建 的資料庫才可以

    回覆刪除
  2. 在你開啟後資料庫引擎就有支援FileStream的功能,日後你新建的資料庫都可以支援,但是你已建立的資料庫還是沒有支援,你需要手動再加入一個FileStream即可,你可以試試下列的語法即可加入:

    ALTER DATABASE [YourDatabaseName]
    ADD FILEGROUP [YourFileStreamGroup] CONTAINS FILESTREAM
    GO

    ALTER DATABASE [YourDatabaseName]
    ADD FILE (NAME = N'YourFileStreamName', FILENAME = N'D:\CaryHsu\FileStreamData')
    TO FILEGROUP YourFileStreamGroup
    GO

    回覆刪除
  3. 謝謝分享, 獲益良多, 感謝

    回覆刪除