Зберігання файлів у SQL Server


80

Я знаю давнє запитання, але з SQL Server 2012, нарешті, нормально зберігати файли в базі даних чи їх слід зберігати у файловій системі, лише посилаючись на них у базі даних?

Якщо зберігати їх у базі даних сьогодні прийнятно, який найефективніший спосіб це зробити?

Я планую застосувати шифрування, тому я розумію, що обробка не буде блискавичною.


6
Не впевнений, що я це роблю. Я просто хочу знати, чи це зараз життєздатний варіант.
CompanyDroneFromSector7G

Відповіді:


116

Існує справді хороша стаття від Microsoft Research під назвою Blob or Not Blob .

Їх висновок після великої кількості тестів та аналізу продуктивності такий:

  • якщо розмір ваших фотографій або документів зазвичай менше 256 КБ, зберігати їх у стовпці VARBINARY бази даних ефективніше

  • якщо розмір ваших фотографій або документів зазвичай перевищує 1 МБ, зберігання їх у файловій системі є більш ефективним (а з атрибутом FILESTREAM SQL Server 2008 вони все ще перебувають під контролем транзакцій та є частиною бази даних)

  • між цими двома, це трохи підкидання залежно від вашого використання

Якщо ви вирішите розмістити свої фотографії в таблиці SQL Server, я настійно рекомендую використовувати окрему таблицю для зберігання цих зображень - не зберігайте фотографії співробітників у таблиці співробітників - зберігайте їх в окремій таблиці. Таким чином, таблиця співробітників може залишатись стрункою та підлою та дуже ефективною, припускаючи, що вам не завжди потрібно також вибирати фотографію працівника як частину ваших запитів.

Для файлових груп перегляньте Файли та архітектура файлових груп . По суті, ви б або створили свою базу даних з окремою групою файлів для великих структур даних від самого початку, або додали додаткову групу файлів пізніше. Давайте назвемо це "LARGE_DATA".

Тепер, коли у вас є нова таблиця для створення, яка повинна зберігати стовпці VARCHAR (MAX) або VARBINARY (MAX), ви можете вказати цю групу файлів для великих даних:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Перевірте вступ MSDN у файлові групи та пограйте з ним!


1
Добре сказано. Звичайно, все залежить від випадку використання, але файловий потік часто є гарним варіантом.
TimothyAWiseman

3
Стаття досліджень, яку ви цитуєте, - з квітня 2006 року. З тих пір, безперечно, багато чого змінилося.
Oxon,

2
@ 1576573987: ні, не дуже - ці висновки все ще діють, наскільки я можу зрозуміти
marc_s

Що стосується зберігання VARBINARY(MAX)в окремій групі файлів, якщо у вас є окрема таблиця "файл", ви просто зберігаєте всю цю таблицю в окремій групі файлів або зберігаєте "мета" дані файлу в стандартних групах файлів і просто зберігаєте VARBINARY(MAX)в нову групу файлів?
RemarkLima,

@RemarkLima: Ви говорите про FILETABLEфункцію в SQL Server 2012? Там лише метадані про файл зберігаються в SQL Server (як з FILESTREAM) - фактичний файл (байти, що його складають) зберігаються поза базою даних, на дисковому накопичувачі
marc_s

29

Там немає до сих пір немає однозначної відповіді. Це залежить від вашого сценарію. MSDN має документацію, яка допоможе вам прийняти рішення.

Тут висвітлено й інші варіанти. Замість того, щоб зберігати у файловій системі безпосередньо або в BLOB, ви можете використовувати FileStream або Файлову таблицю в SQL Server 2012. Переваги Файлової таблиці здаються незрозумілими (але, правда, у мене немає особистого досвіду з ними). .)

Статтю, безумовно, варто прочитати.


11

Ви можете прочитати на FILESTREAM . Ось деяка інформація з документів, яка повинна допомогти вам прийняти рішення:

Якщо виконуються наступні умови, вам слід розглянути можливість використання FILESTREAM:

  • Об’єкти, що зберігаються, в середньому перевищують 1 МБ.
  • Важливий швидкий доступ до читання.
  • Ви розробляєте програми, які використовують логіку середнього рівня.

Для менших об’єктів зберігання змінних (максимум) BLOB в базі даних часто забезпечує кращу продуктивність потокової передачі.


Насправді я міг зробити і те, і інше, залежно від розміру файлу. Дякую!
CompanyDroneFromSector7G
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.