2009-11-30 40 views
3

在SQL Server 2008中存儲大量圖像數據的最佳做法是什麼?我預計會使用大約5個存儲空間存儲大約50,000張圖像。目前我使用一個單一的表中的列這樣做:用於存儲大量圖像的SQL Server表結構

ID: int/PK/identity 
Picture: Image 
Thumbnail: Image 
UploadDate: DateTime 

我很擔心,因爲在10%左右我預計總產能的好像刀片花費很長的時間。典型的圖像大約在20k到30k之間。有沒有更好的邏輯結構來存儲這些數據?還是我需要考慮集羣或其他IT解決方案以適應數據加載?

+0

你爲什麼要將圖像存儲在數據庫中,而不是隻存儲每個圖像的路徑?文件系統很好地處理文件。 – dnagirl 2009-11-30 15:11:49

+0

@dnagirl - 好奇,你如何保持文件和元數據記錄同步?如果圖像經常更改(使用版本控制進行照片編輯),我會想象恢復數據庫和文件備份會導致孤立數據? – JeffO 2009-11-30 16:47:40

+0

典型的20-30K的尺寸,你完全可以把它存儲在表格中,沒問題。但請使用VARBINARY(MAX)而不是已棄用的「IMAGE」類型! – 2009-11-30 16:48:47

回答

4

Image是在SQL Server 2008中它已經因爲SQL Server 2005中如果你決定將圖像存儲在數據庫中,那麼你應該使用VARBINARY(MAX)領域,並考慮加入FILESTREAM選項被替換VARBINARY(MAX)一個過時的數據類型。

對於流數據,如圖像,FILESTREAM比單獨VARBINARY(MAX)快得多,根據this white paper

Filestream vs. varbinary(max) performance http://i.msdn.microsoft.com/cc949109.image002(en-us).gif

注意,要達到這個數據流性能,必須使用適當的API在您的設計,並獲得Win32 handle of the BLOB。請注意,更新到FILESTREAM列(包括INSERTS)將比VARBINARY(MAX)慢。

4

要DB還是不要DB,就是這個問題。

你在這裏開始與DB中的圖像的宗教戰爭。

該意見將被拆分爲SQL 2000,但2005和更高版本在存儲blob方面做得相當不錯 - 只需查看使用MS SQL Server作爲存儲的SharePoint安裝數量。我只會走這條路來做小圖片存儲。

如果你最終把它們放在數據庫中,我會說你應該將圖像從與其相關的數據中分離出來,以便查詢和減少你的IO以及開發人員編寫的實例SELECT *(是的,它們將)。

查看SQL 2008中的FILESTREAM - 它是爲了這樣的事情。

這裏是DB的其他一些觀點與文件系統,你可能要考慮:

  • DB存儲,備份,恢復,維護許可是昂貴
  • 存儲在數據庫中harded得到的不是磁盤
  • 磁盤可以加速
  • 你需要編寫代碼來獲得/ DB中的一組圖像 - 不需要磁盤
+0

如何同步數據庫和文件之間的備份還原?這對於管理經常更改並需要版本控制的圖像的應用來說很難。似乎文件和元數據記錄將關閉。 – JeffO 2009-11-30 16:50:14

+0

我更喜歡基於插入的模型來更新基於模型。因此,如果用戶有新圖像,我不會覆蓋該記錄,我會選擇添加一個新行,並使用標記爲不使用標誌的舊行。我將把文件和數據庫作爲單個事務寫入 - 它們在某個時間點始終保持同步。 – 2009-12-01 00:48:05

2

查看SQL Server 2008中的新功能Filestream。本質上,它可以讓您在數據庫中存儲blob(讀取:image)數據,而無需在每次讀取和寫入時將數據讀入sql緩衝區。它無縫地使用filesytem來存儲你的大文件而不是sql頁面。這可能會導致更大的文件更快的讀取和寫入時間,最重要的是,因爲這一切都發生在引擎蓋下,您不需要更改任何現有的存儲過程以使用filestream列。有關代碼示例和一些性能分析,請參見here