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 不会。
避免在包含非空 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 数据库引擎中。如果您必须确定 BLOB 文件的长度,请使用 Transact-SQL DATALENGTH() 函数确定 BLOB 的大小(如果它是关闭的)。DATALENGTH() 不会打开 BLOB 文件来确定其大小。
如果应用程序使用 Message Block1 (SMB1) 协议,则应以 60 KB 的倍数读取 FILESTREAM BLOB 数据以优化性能。