Структура таблицы SQL Server для хранения большого количества изображений - PullRequest
3 голосов
/ 30 ноября 2009

Какова наилучшая практика для хранения большого количества данных изображений в SQL Server 2008? Я ожидаю хранить около 50 000 изображений, используя около 5 гигабайт дискового пространства. В настоящее время я делаю это, используя одну таблицу со столбцами:

ID: int/PK/identity
Picture: Image
Thumbnail: Image
UploadDate: DateTime

Я обеспокоен тем, что примерно на 10% моей ожидаемой общей емкости кажется, что вставки занимают много времени. Типичное изображение около 20k - 30k. Есть ли лучшая логическая структура для хранения этих данных? Или мне нужно изучить кластеризацию или какое-то другое ИТ-решение, чтобы справиться с нагрузкой данных?

Ответы [ 3 ]

4 голосов
/ 30 ноября 2009

Image является устаревшим типом данных в SQL Server 2008. Он был заменен на VARBINARY(MAX) начиная с SQL Server 2005. Если вы решили сохранить изображение в БД, то вам следует использовать поля VARBINARY(MAX) и рассмотреть добавление опции FILESTREAM.

Для потоковой передачи данных, таких как изображения, FILESTREAM намного быстрее, чем один VARBINARY(MAX), согласно этой белой книге :

Filestream vs. varbinary(max) performance
(источник: microsoft.com )

Обратите внимание, что для достижения этой производительности потоковой передачи вы должны использовать соответствующий API в своем проекте и получить дескриптор Win32 BLOB . Обратите внимание, что обновления в столбце FILESTREAM (включая INSERTS) будут выполняться медленнее, чем VARBINARY(MAX).

4 голосов
/ 30 ноября 2009

К БД или не к БД, вот в чем вопрос.

Вы начинаете здесь религиозную войну с изображениями в БД.

Мнение было бы разделено для SQL 2000, но 2005 и выше достаточно неплохо справляются с хранением больших двоичных объектов - просто посмотрите на число установок SharePoint, которые используют MS SQL Server в качестве хранилища. Я бы пошел по этому пути только для незначительного хранения изображений.

Если вы в конечном итоге поместите их в БД, я бы сказал, что вам следует отделить образ от данных, связанных с ним, для упрощения запросов и уменьшения количества операций ввода-вывода и случаев, когда разработчики пишут SELECT * (и да, они будут).

Проверьте FILESTREAM в SQL 2008 - он предназначен для таких вещей.

Вот некоторые другие моменты, касающиеся БД и файловой системы, которые вы можете рассмотреть:

  • Хранение БД, резервное копирование, восстановление, лицензирование обслуживания дорого
  • Сложнее получить доступ к хранилищу в БД, чем на диске
  • Диск может быть ускорен
  • Вам потребуется написать код для получения / установки изображений в БД - не требуется для диска
2 голосов
/ 30 ноября 2009

Ознакомьтесь с новыми функциями Файловый поток в SQL Server 2008. По сути, он позволяет вам хранить данные BLOB-объектов (читай: изображение) в базе данных, без необходимости читать данные в буферах SQL на каждом прочти и напиши. Он легко использует файловую систему для хранения ваших больших файлов вместо страниц SQL. Это может привести к гораздо более быстрому времени чтения и записи для больших файлов, и, что лучше всего, поскольку все это происходит под капотом, вам не нужно менять какие-либо существующие хранимые процедуры для работы со столбцами файлового потока. Смотрите здесь для примеров кода и некоторого профилирования производительности.

...