Этой статьей мы начинаем публикацию серии блогов по системе FILESTREAM встроенной в MS SQL Server и позволяющей хранить на файловой системе неструктурированные данные, которые ранее хранились в таблицах SQL Server. Основная цель - познакомить вас с внутренними механизмами обеспечивающими работу FILESTREAM. При этом мы будем рассматривать связь с операционной системой и внутренними таблицами SQL Server.
И так, начнем
Большинство типов данных является неструктурированными (например, текстовые документы, изображения и видеоролики). Такие неструктурированные данные часто хранятся за пределами базы данных отдельно от структурированных данных. Подобное разделение может привести к усложнению управления данными. Либо, если данные связаны со структурированным хранилищем, могут быть ограничены возможности файловых потоков и производительность.
Хранилище FILESTREAM объединяет компонент SQL Server Database Engine с файловой системой NTFS, размещая данные больших двоичных объектов (BLOB) типа varbinary(max) в файловой системе в виде файлов. С помощью инструкций Transact-SQL можно вставлять, обновлять, запрашивать, выполнять поиск и выполнять резервное копирование данных FILESTREAM. Интерфейсы файловой системы Win32 предоставляют потоковый доступ к этим данным.
Для кэширования данных файлов в хранилище FILESTREAM используется системный кэш NT. Это позволяет снизить возможное влияние данных FILESTREAM на производительность компонента Database Engine. Буферный пул SQL Server не используется, поэтому данная память доступна для обработки запросов.
Что вас может подтолкнуть к использованию FILESTREAM
В SQL Server большие двоичные объекты (BLOB) могут представлять собой данные стандартного типа varbinary(max), данные которых хранятся в таблице, либо объекты FILESTREAM типа varbinary(max), данные которых хранятся в файловой системе. Выбор в качестве хранилища базы данных или файловой системы определяется размером и назначением данных. Объекты FILESTREAM следует использовать в следующих случаях:
- средний размер сохраняемых объектов превышает 1 МБ;
- важен быстрый доступ для чтения;
- в разрабатываемых приложениях для логики приложений используется средний уровень.
При работе с объектами меньшего размера сохранение больших двоичных объектов (BLOB) типа varbinary(max) в базе данных часто позволяет добиться лучшей производительности потоков.
Хранение данных в FileStream
Хранилище FILESTREAM реализовано в виде столбца типа varbinary(max), данные которого хранятся в файловой системе как большие двоичные объекты (BLOB). Размеры объектов BLOB ограничены только размером тома файловой системы. Стандартное ограничение типа varbinary(max), согласно которому размер файла не должен превышать 2 ГБ, не применяется к объектам BLOB, сохраняемым в файловой системе.
Чтобы указать необходимость сохранения данных столбца в файловой системе, укажите атрибут FILESTREAM для столбца varbinary(max). В результате компонент Database Engine будет сохранять все данные этого столбца в файловой системе, а не в файле базы данных.
Данные FILESTREAM должны сохраняться в файловых группах FILESTREAM. Файловая группа FILESTREAM представляет собой особую файловую группу, в которой вместо самих файлов содержатся системные каталоги файлов. Данные системные каталоги файлов называются контейнерами данных. Они являются интерфейсом между хранилищем компонента Database Engine и хранилищем файловой системы.
При использовании хранилища FILESTREAM обратите внимание на следующие аспекты:
- если в таблице присутствует столбец FILESTREAM, каждая строка должна иметь уникальный идентификатор строки (не равен NULL);
- вложенность контейнеров данных FILESTREAM не допускается;
- при использовании кластера отработки отказа файловые группы FILESTREAM должны находиться в ресурсах общего диска;
- файловые группы FILESTREAM могут размещаться на сжатых томах.
В следующих статьях мы расскажем, о том:
- Как FILESTREAM связан с операционной системой
- Как и в каких таблицах (включая внутренние таблицы) хранятся информация о FILESTRTEAM.
- Как получить доступ к объектам FILESTREAM из Transact-SQL.
- Как получить доступ к объектам FILESTREAM из приложения написанного на C#.
- ... и о многом другом.
Александр Каленик, Senior Premier Field Engineer (PFE), MSFT (Russia)