Almacenamiento de archivos en SQL Server


80

Es una vieja pregunta que sé, pero con SQL Server 2012, ¿finalmente está bien almacenar archivos en la base de datos, o realmente deberían mantenerse en el sistema de archivos con solo referencias a ellos en la base de datos?

Si almacenarlos en la base de datos se considera aceptable en estos días, ¿cuál es la forma más efectiva de hacerlo?

Estoy planeando aplicar el cifrado, así que agradezco que el procesamiento no sea tan rápido como un rayo.


6
No estoy seguro si lo hago. Solo quiero saber si es una opción viable ahora.
CompanyDroneFromSector7G

Respuestas:


116

Hay un artículo realmente bueno de Microsoft Research llamado To Blob o Not To Blob .

Su conclusión después de una gran cantidad de pruebas de rendimiento y análisis es la siguiente:

  • Si sus imágenes o documentos suelen tener un tamaño inferior a 256 K, almacenarlos en una columna VARBINARY de la base de datos es más eficiente

  • Si sus imágenes o documentos suelen tener un tamaño superior a 1 MB, almacenarlos en el sistema de archivos es más eficiente (y con el atributo FILESTREAM de SQL Server 2008, todavía están bajo control transaccional y forman parte de la base de datos)

  • entre esos dos, es un poco complicado dependiendo de su uso

Si decide poner sus imágenes en una tabla de SQL Server, le recomiendo encarecidamente utilizar una tabla separada para almacenar esas imágenes; no almacene la foto del empleado en la tabla de empleados; manténgalas en una tabla separada. De esa manera, la tabla de Empleados puede ser sencilla, mezquina y muy eficiente, asumiendo que no siempre es necesario seleccionar la foto del empleado también como parte de sus consultas.

Para grupos de archivos, consulte Archivos y Arquitectura de grupos de archivos para obtener una introducción. Básicamente, crearía su base de datos con un grupo de archivos separado para estructuras de datos grandes desde el principio o agregaría un grupo de archivos adicional más adelante. Llamémoslo "LARGE_DATA".

Ahora, siempre que tenga una nueva tabla para crear que necesite almacenar columnas VARCHAR (MAX) o VARBINARY (MAX), puede especificar este grupo de archivos para los datos grandes:

 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

¡Consulte la introducción de MSDN sobre grupos de archivos y juegue con ella!


1
Bien dicho. Por supuesto, todo depende del caso de uso, pero filestream suele ser una buena opción.
TimothyAWiseman

3
El artículo de investigación que ha citado es de abril de 2006. Seguramente muchas cosas han cambiado desde entonces.
Oxon

2
@ 1576573987: no, en realidad no - estas conclusiones siguen siendo válidas, por lo que puedo decir
marc_s

Con respecto al almacenamiento VARBINARY(MAX)en un grupo de archivos separado, si tiene una tabla de "archivos" separada, ¿simplemente almacena esa tabla completa en el grupo de archivos separado o almacena los datos "meta" del archivo en los grupos de archivos estándar y simplemente almacena los datos VARBINARY(MAX)en el nuevo grupo de archivos?
Observación Lima

@RemarkLima: ¿estás hablando de la FILETABLEfunción en SQL Server 2012? Allí, solo los metadatos sobre el archivo se almacenan dentro de SQL Server (como con FILESTREAM) - el archivo real (los bytes que lo componen) se almacenan fuera de la base de datos, en una unidad de disco
marc_s

29

Hay todavía hay una respuesta sencilla. Depende de tu escenario. MSDN tiene documentación para ayudarlo a decidir.

Hay otras opciones cubiertas aquí. En lugar de almacenar en el sistema de archivos directamente o en un BLOB, puede usar FileStream o File Table en SQL Server 2012. Las ventajas de File Table parecen ser algo obvio (pero es cierto que no tengo experiencia personal de primera mano con ellos .)

Definitivamente vale la pena leer el artículo.


11

Puede leer sobre FILESTREAM . Aquí hay información de los documentos que debería ayudarlo a decidir:

Si se cumplen las siguientes condiciones, debería considerar el uso de FILESTREAM:

  • Los objetos que se almacenan tienen, en promedio, más de 1 MB.
  • El acceso de lectura rápido es importante.
  • Está desarrollando aplicaciones que utilizan un nivel medio para la lógica de la aplicación.

Para objetos más pequeños, almacenar BLOB varbinary (max) en la base de datos a menudo proporciona un mejor rendimiento de transmisión.


De hecho, podría hacer ambas cosas, dependiendo del tamaño del archivo. ¡Gracias!
CompanyDroneFromSector7G
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.