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 資料,以便發揮最佳效能。