Рекомендации по FILESTREAM
В этом разделе приведены рекомендации по использованию FILESTREAM.
Физическая настройка и поддержка
При использовании томов хранилища FILESTREAM обратите внимание на следующие рекомендации.
Отключите короткие имена файлов на компьютерах с FILESTREAM. Короткие имена файлов создаются гораздо дольше. Отключить короткие имена файлов можно с помощью программы Windows fsutil.
Регулярно выполняйте дефрагментацию на компьютерах с FILESTREAM.
Используйте файловую систему NTFS с кластерами по 64 килобайт. На сжатых томах должна быть файловая система NTFS с кластерами по 4 килобайта.
Отключите индексирование на томах FILESTREAM и установите параметр 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, примите к сведению следующие рекомендации.
Представляйте неинициализированный столбец FILESTREAM с помощью значения NULL, а не 0x. Значение 0x вызовет создание файла, а NULL — нет.
Избегайте операций вставки и удаления в таблицах, которые содержат столбцы FILESTREAM, отличные от NULL. Эти операции могут изменять таблицы FILESTREAM, которые используются для сборки мусора. Это может приводить к постепенному снижению производительности приложения.
В приложениях, использующих репликацию, следует применять функцию NEWSEQUENTIALID() вместо NEWID(). Функция NEWSEQUENTIALID() создает идентификаторы GUID в этих приложениях эффективнее, чем NEWID().
Функции API FILESTREAM предназначены для потокового доступа к данным на платформе Win32. Старайтесь не использовать Transact-SQL для чтения или записи двоичных объектов FILESTREAM, если их размер больше 2 мегабайт. Если необходимо выполнять чтение или запись больших двоичных объектов из Transact-SQL, убедитесь, что данные объекта использованы до того, как открывать такой объект FILESTREAM BLOB из Win32. Неиспользование всех данных Transact-SQL может привести к сбою при открытии или закрытии любого последующего объекта FILESTREAM.
Старайтесь не использовать инструкции Transact-SQL, которые обновляют большие двоичные объекты FILESTREAM или прикрепляют к ним данные. Это приводит к буферизации данных таких объектов в базе данных tempdb с последующей передачей в новый физический файл.
Старайтесь избегать мелких обновлений больших двоичных объектов FILESTREAM. Каждая такая операция приводит к копированию базовых файлов FILESTREAM. Если приложению приходится прикреплять небольшие двоичные объекты, их следует записывать в столбец varbinary(max), а затем выполнять одиночную операцию записи в большой двоичный объект FILESTREAM, когда число объектов достигнет установленного предела.
Старайтесь не получать размер большого количества файлов больших двоичных объектов в приложении. На эту операцию уходит много времени, поскольку размер не хранится в компоненте SQL Server Database Engine. Если необходимо выяснить размер файла большого двоичного объекта, воспользуйтесь функцией Transact-SQL DATALENGTH(), чтобы определить размер объекта, если он закрыт. Функция DATALENGTH() не открывает объект, чтобы определить его размер.
Если в приложении используется протокол Message Block1 (SMB1), то для оптимизации производительности данные больших двоичных объектов FILESTREAM должны считываться блоками по 60 килобайт.