共用方式為


FILESTREAM 最佳作法

這個主題將提供使用 FILESTREAM 的建議最佳作法。

實體組態和維護

當您設定 FILESTREAM 儲存體磁碟區時,請考慮下列指導方針:

  • 在 FILESTREAM 電腦系統上關閉簡短檔案名稱。簡短檔案名稱會花費更長的時間來建立。若要停用簡短檔案名稱,請使用 Windows fsutil 公用程式。

  • 定期重組 FILESTREAM 電腦系統。

  • 使用 64-KB NTFS 叢集。壓縮的磁碟區必須設定為 4-KB NTFS 叢集。

  • 針對 FILESTREAM 磁碟區停用索引並且設定 disablelastaccess。若要設定 disablelastaccess,請使用 Windows fsutil 公用程式。

  • 在非必要的情況下,停用 FILESTREAM 磁碟區的防毒掃描。如果防毒掃描是必要的功能,請避免設定自動刪除違規檔案的原則。

  • 針對容錯和應用程式所需的效能設定並微調 RAID 層級。

RAID 層級

寫入效能

讀取效能

容錯

備註

RAID 5

一般

一般

非常好

效能高於單一磁碟或 JBOD,而低於具有條狀配置的 RAID 0 或 RAID 5。

RAID 0

非常好

非常好

RAID 5 + 條狀配置

非常好

非常好

非常好

成本最高的選項。

實體資料庫設計

當您設計 FILESTREAM 資料庫時,請考慮下列指導方針:

  • FILESTREAM 資料行必須附帶對應的 uniqueidentifier ROWGUID 資料行。這些種類的資料表也必須附帶唯一的索引。一般而言,這個索引不是叢集索引。如果資料庫商務邏輯需要叢集索引,您就必須確定儲存在索引中的值不是隨機的。隨機值將會導致每次在資料表中加入或移除資料列時,重新排列索引。

  • 基於效能考量,FILESTREAM 檔案群組和容器應該位於作業系統、SQL Server 資料庫、SQL Server 記錄、tempdb 或分頁檔以外的磁碟區上。

  • FILESTREAM 無法直接支援空間管理和原則。不過,您可以透過將每個 FILESTREAM 檔案群組指派至個別的磁碟區並使用磁碟區的管理功能,以間接方式管理空間和套用原則。

應用程式設計和實作

  • 當您要設計和實作使用 FILESTREAM 的應用程式時,請考慮下列指導方針:

  • 使用 NULL (而非 0x) 來表示未初始化的 FILESTREAM 資料行。0x 值會導致系統建立檔案,而 NULL 則不會。

  • 避免在包含非 Null FILESTREAM 資料行的資料表中進行插入和刪除作業。插入和刪除作業可能會修改用於記憶體回收的 FILESTREAM 資料表。這可能會導致應用程式的效能隨著時間降低。

  • 在使用複寫的應用程式中,使用 NEWSEQUENTIALID() 來取代 NEWID()。就這些應用程式的 GUID 產生而言,NEWSEQUENTIALID() 的執行效能高於 NEWID()。

  • FILESTREAM API 是針對資料的 Win32 資料流存取所設計。請避免使用 Transact-SQL 來讀取或寫入超過 2 MB 的 FILESTREAM 二進位大型物件 (BLOB)。如果您必須從 Transact-SQL 讀取或寫入 BLOB,請在嘗試從 Win32 開啟 FILESTREAM BLOB 之前,確定已取用所有 BLOB 資料。如果無法取用所有 Transact-SQL 資料,可能會導致任何後續的 FILESTREAM 開啟或關閉作業失敗。

  • 避免使用更新、附加或預先附加資料至 FILESTREAM BLOB 的 Transact-SQL 陳述式。這會導致 BLOB 資料多工緩衝處理到 tempdb 資料庫中,然後送回新的實體檔案。

  • 避免將小型 BLOB 更新附加至 FILESTREAM BLOB。每次附加都會導致系統複製基礎 FILESTREAM 檔案。如果應用程式必須附加小型 BLOB,請將這些 BLOB 寫入 varbinary(max) 資料行,然後在 BLOB 的數目到達預先決定的限制時,針對 FILESTREAM BLOB 執行單一寫入作業。

  • 避免在應用程式中擷取大量 BLOB 檔案的資料長度。這是一項耗時的作業,因為大小不會儲存在 SQL Server Database Engine 中。如果您必須判斷 BLOB 檔案的長度,請使用 Transact-SQL DATALENGTH() 函數來判斷 BLOB 的大小 (如果它已關閉的話)。DATALENGTH() 不會開啟 BLOB 檔案來判斷其大小。

  • 如果應用程式使用 Message Block1 (SMB1) 通訊協定,您就應該以 60-KB 的倍數來讀取 FILESTREAM BLOB 資料,以便發揮最佳效能。

請參閱

概念