2012-11-16 37 views
64

這是我所知的一個老問題,但對於SQL Server 2012,將文件存儲在數據庫中還是應該保存在文件系統中,並且只保存數據庫中的引用?在SQL Server中存儲文件

如果現在把它們存儲在數據庫中被認爲是可以接受的,那麼最有效的方法是什麼? 我打算申請加密,所以我很欣賞處理不會閃電般快。

感謝

+6

不知道如果我這樣做。我只想知道現在是否可行。 – CompanyDroneFromSector7G

回答

88

微軟研究院有一篇名爲To Blob or Not To Blob的非常好的論文。

他們大量的性能測試和分析後得出的結論是這樣的:

  • 如果您的圖片或文檔通常低於在大小256K,將它們存儲在一個數據庫VARBINARY列更有效

  • 如果您的圖片或文檔的大小通常超過1 MB,將它們存儲在文件系統中效率更高(並且使用SQL Server 2008的FILESTREAM屬性,它們仍處於事務控制和數據庫的一部分)

  • 在這兩個之間,這取決於你的使用有點難以取捨的

如果你決定把你的照片到SQL Server表,我會強烈建議使用一個單獨的表用於存儲那些圖片 - 不要將員工照片存儲在員工表中 - 將他們保存在單獨的表格中。這樣一來,假設您並不總是需要選擇員工照片作爲查詢的一部分,那麼員工表可以保持精簡併且非常有效。

對於文件組,請查看Files and Filegroup Architecture的介紹。基本上,您可以從一開始就爲大數據結構創建一個單獨的文件組的數據庫,或者稍後添加一個額外的文件組。我們稱之爲「LARGE_DATA」。

現在,只要你有一個新的表來創建一個需要存儲VARCHAR(MAX)或VARBINARY(MAX)列,可以爲大型數據指定該文件組:

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

時退房MSDN介紹文件組,並玩弄它!

+1

說得好。這當然取決於用例,但文件流通常是一個不錯的選擇。 – TimothyAWiseman

+2

您引用的研究文章是從2006年4月起。從那時起,很多事情都發生了變化。 – Oxon

+2

@ 1576573987:不,不是真的 - 這些結論仍然有效,據我所知 –

10

您可能會在FILESTREAM讀了。下面是從文檔的一些信息,應該幫助你決定:

如果滿足以下條件,您應考慮使用FILESTREAM:正在存儲的平均

  • 對象,大於1 MB。
  • 快速讀取訪問非常重要。
  • 您正在開發爲應用程序邏輯使用中間層的應用程序。

對於較小的對象,存儲的varbinary(最大)的BLOB在數據庫中通常會提供更好的數據流性能。

+0

其實我可以做/兩者,這取決於文件大小。謝謝! – CompanyDroneFromSector7G

22

仍然沒有簡單的答案。這取決於你的情況。 MSDN has documentation to help you decide.

這裏還有其他選項。可以使用SQL Server 2012中的FileStream或File Table,而不是直接存儲在文件系統中或存儲在BLOB中.File Table的優點看起來像是一個不聰明的人(但我承認我沒有親身體驗過他們的第一手經驗)

這篇文章絕對值得一讀。

+0

+1,更好的鏈接2012年。 –

+0

良好的信息謝謝! – CompanyDroneFromSector7G