almacenamiento con FILESTREAM

Anuncio
Artículo técnico de SQL Server
Autor: Paul S. Randal (SQLskills.com)
Revisores técnicos: Alexandru Chirica, Arkadi Brjazovski, Prem Mehra, Joanna Omel,
Mike Ruthruff, Robin Dhamankar
Fecha de publicación: octubre de 2008
Se aplica a: SQL Server 2008
Resumen: en estas notas del producto se describe la característica FILESTREAM de SQL
Server 2008, que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una
combinación de SQL Server 2008 y el sistema de archivos NTFS. También se explican las
distintas opciones de almacenamiento de BLOB, la configuración de Windows y SQL Server
para usar datos de FILESTREAM, los aspectos que hay que tener en cuenta a la hora de
combinar FILESTREAM con otras características, y detalles de implementación como la
creación de particiones y el rendimiento.
Estas notas del producto están destinadas a arquitectos, profesionales de TI y DBA encargados
de la evaluación o implementación de FILESTREAM. Se da por supuesto que el lector está
familiarizado con Windows y SQL Server, y que tiene al menos unos conocimientos rudimentarios
de conceptos de base de datos como las transacciones.
Introducción
En la sociedad actual se generan datos a unas velocidades increíbles y a menudo es necesario
almacenarlos y obtener acceso a ellos de manera controlada y eficiente. Existen distintas tecnologías
para ello y la elección de la tecnología suele depender de la naturaleza de los datos que se van
a almacenar: estructurados, semiestructurados o no estructurados:

Los datos estructurados son aquellos que se pueden almacenar fácilmente en un esquema
relacional, como los que representan datos de ventas de una empresa. Se pueden almacenar en
una base de datos con una tabla de información para los productos que la compañía vende, otra
tabla con información sobre los clientes y otra tabla con los detalles de ventas de los productos
a los clientes. El acceso a los datos y su manipulación se realiza mediante un lenguaje de consultas
enriquecido como Transact-SQL.


Los datos semiestructurados son aquellos que se ajustan a un esquema flexible pero que no se
suelen almacenar bien en un conjunto de tablas de base de datos, como aquellos en los que
cada punto de datos puede tener atributos radicalmente diferentes. Los datos semiestructurados
suelen almacenarse con el tipo de datos xml en el software de base de datos Microsoft® SQL
Server® y normalmente se obtiene acceso a ellos mediante un lenguaje de consultas basado en
elementos como XQuery.
Los datos no estructurados pueden no tener ningún esquema (por ejemplo, un fragmento de
datos cifrados) o pueden ser grandes cantidades de datos binarios (muchos megabytes o incluso
gigabytes) que parecen no tener ningún esquema pero en realidad tienen un esquema muy
simple inherente, como los archivos de imagen, vídeo de transmisión por secuencias o clips de
sonido. En este caso, los datos binarios se refieren a datos que pueden tener cualquier valor, no
solo los que se pueden escribir con un teclado. Estos valores de datos se conocen comúnmente
como objetos binarios grandes, o simplemente blobs.
En estas notas del producto se describe la característica FILESTREAM de SQL Server 2008, que permite
el almacenamiento y el acceso eficiente a datos BLOB mediante una combinación de SQL Server 2008
y el sistema de archivos NTFS. Se explica la característica FILESTREAM propiamente dicha, las opciones
de almacenamiento de BLOB, la configuración del sistema operativo Windows® y SQL Server para usar
datos de FILESTREAM, los aspectos que hay que tener en cuenta a la hora de combinar FILESTREAM
con otras características, y detalles de implementación como las particiones y el rendimiento.
Opciones para el almacenamiento de blobs
Si bien los datos estructurados y semiestructurados se pueden almacenar fácilmente en una base de
datos relacional, la elección de dónde almacenar los datos no estructurados o BLOB es más complicada.
A la hora de decidir dónde almacenar los datos BLOB, tenga en cuenta los siguientes requisitos:



2
Rendimiento: la manera en que se van a usar los datos es un factor fundamental. Si se necesita
acceso de transmisión por secuencias, el almacenamiento de los datos dentro de una base de
datos de SQL Server puede ser más lento que almacenarlos externamente en una ubicación
como el sistema de archivos NTFS. Cuando se usa el almacenamiento del sistema de archivos,
los datos se leen del archivo y se pasan a la aplicación cliente (directamente o con un almacenamiento
en búfer adicional). Cuando los datos BLOB se almacenan en una base de datos de SQL Server,
primero se deben leer en la memoria de SQL Server (el grupo de búferes) y después se devuelven
a la aplicación cliente a través de una conexión de cliente. Esto no solo significa que los datos
pasan por una fase de procesamiento adicional; también significa que la memoria de SQL Server
está "contaminada" innecesariamente con datos BLOB, lo que puede causar problemas de
rendimiento en operaciones posteriores de SQL Server.
Seguridad: los datos confidenciales cuyo acceso se debe administrar estrechamente se pueden
almacenar en una base de datos y se puede supervisar la seguridad mediante los controles de
acceso habituales de SQL Server. Si se almacenan los mismos datos en el sistema de archivos, es
necesario implementar distintos métodos de seguridad como las listas de control de acceso (ACL).
Tamaño de los datos: según el estudio que se cita más adelante en estas notas del producto, es
mejor almacenar los blob de menos de 256 kilobytes (kB) (como los iconos de widget) en una
base de datos y los blobs de más de 1 megabyte (MB) fuera de la base de datos. En el caso de
datos cuyo tamaño está comprendido entre 256 kB y 1 MB, la solución de almacenamiento más
eficiente depende de la proporción de lectura y escritura de los datos, y de la tasa de "sobrescritura".
El almacenamiento de datos BLOB exclusivamente dentro de la base de datos (por ejemplo,
usando el tipo de datos varbinary (max)) está limitado a 2 gigabytes (GB) por BLOB.





Acceso de cliente: el protocolo que el cliente emplea para obtener acceso a datos de SQL
Server, como ODBC, quizás no sea el adecuado para aplicaciones como la transmisión por
secuencias de archivos de vídeo grandes. En este caso, puede ser necesario almacenar los
datos en el sistema de archivos.
Semántica transaccional: si los datos BLOB tienen asociados datos estructurados que se
almacenarán en la base de datos, los cambios en los datos BLOB necesitarán ajustarse a la
semántica transaccional para que los dos conjuntos de datos estén sincronizados. Por ejemplo,
si una transacción crea datos BLOB y una fila en una tabla de base de datos pero después hace
una reversión, se debe revertir la creación de los datos BLOB y la creación de la fila de la tabla.
Esto puede resultar muy complejo si los datos BLOB se almacenan en el sistema de archivos sin
ningún vínculo a la base de datos.
Fragmentación de datos: las actualizaciones y sobrescrituras frecuentes harán que los BLOB se
muevan, ya sea dentro de los archivos de base de datos de SQL Server o dentro del sistema de
archivos, en función de dónde se almacenen los datos. En este caso, si los BLOB son grandes,
se pueden fragmentar (es decir, pueden no almacenarse en una parte contigua del disco). Es
más fácil resolver esta fragmentación si se usa el sistema de archivos en lugar de SQL Server.
Facilidad de uso: es más difícil y costoso administrar una solución que emplea varias tecnologías
no integradas que una solución integrada.
Costo: el costo de la solución de almacenamiento varía en función de la tecnología que se emplea.
Las explicaciones anteriores sobre el tamaño y la fragmentación se basan en el conocido documento de
Microsoft Research BLOB o no BLOB: ¿almacenamiento de objetos grandes en una base de datos o en
un sistema de archivos? (Gray, Van Ingen y Sears). Este documento contiene más información sobre las
ventajas y desventajas de ambos modelos y se puede descargar desde aquí:
http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45
Existen diversas soluciones para el almacenamiento de BLOB, y cada una de ellas tiene sus pros y sus
contras, según los requisitos indicados anteriormente. En la tabla siguiente se comparan tres opciones
frecuentes para almacenar datos BLOB, incluido FILESTREAM, en SQL Server 2008.
Punto de
comparación
Tamaño máximo
de BLOB
Rendimiento de la
transmisión por
secuencias de BLOB
grandes
Seguridad
Costo por GB
Facilidad de uso
Integración con
datos estructurados
Desarrollo
e implementación
de aplicaciones
3
Servidor de
archivos/sistema
de archivos
Tamaño del volumen
NTFS
Excelente
Solución de almacenamiento
SQL Server
FILESTREAM
(con varbinary (max))
2 GB - 1 bytes
Deficiente
ACL manuales
Integrada
Bajo
Difícil
Difícil
Alto
Integrada
Coherencia en el nivel
de datos
Más sencillos
Más complejos
Tamaño del volumen
NTFS
Excelente
Integrada + ACL
automáticas
Bajo
Integrada
Coherencia en el nivel
de datos
Más sencillos
Punto de
comparación
Servidor de
archivos/sistema
de archivos
Excelente
Solución de almacenamiento
SQL Server
FILESTREAM
(con varbinary (max))
Recuperación
Deficiente
Excelente
de la fragmentación
de datos
Rendimiento de
Excelente
Moderado
Deficiente
pequeñas
actualizaciones
frecuentes
Tabla 1: comparación de las tecnologías de almacenamiento de BLOB anteriores a SQL Server 2008
FILESTREAM es la única solución que proporciona coherencia transaccional de los datos estructurados
y no estructurados, así como administración integrada, seguridad, bajo costo y excelente rendimiento de
transmisión de datos por secuencias. Para lograrlo, almacena los datos estructurados en los archivos de
base de datos y los datos BLOB no estructurados en el sistema de archivos, al tiempo que mantiene la
coherencia transaccional entre los dos almacenamientos. En la sección "Información general de
FILESTREAM" más adelante en estas notas del producto se proporcionan más detalles sobre la
arquitectura de FILESTREAM.
Información general de FILESTREAM
FILESTREAM es una característica nueva de SQL Server 2008. Permite almacenar los datos
estructurados en la base de datos y almacenar directamente en el sistema de archivos NTFS los datos
no estructurados asociados (es decir, los BLOB). El acceso a los datos BLOB se realiza mediante las
API de transmisión por secuencias de Win32® de alto rendimiento, lo que evita la penalización de
rendimiento que supone el acceso a los datos BLOB a través de SQL Server.
FILESTREAM mantiene en todo momento la coherencia transaccional entre los datos estructurados y no
estructurados, e incluso permite la recuperación a un momento dado de los datos de FILESTREAM
mediante copias de seguridad de registros. SQL Server mantiene automáticamente la coherencia y no se
necesita ninguna lógica personalizada en la aplicación. Para ello, el mecanismo de FILESTREAM
mantiene el equivalente de un registro de transacciones de la base de datos, que comparte muchos
requisitos de administración (se describen con más detalle en la sección "Configurar la recolección de
elementos no utilizados de FILESTREAM", más adelante en estas notas del producto). La combinación
del registro de transacciones de la base de datos y el registro de transacciones de FILESTREAM permite
la correcta recuperación transaccional de los datos estructurados y de FILESTREAM.
En lugar de ser un tipo de datos completamente nuevo, FILESTREAM es un atributo de almacenamiento
del tipo de datos varbinary (max) existente. FILESTREAM mantiene gran parte del comportamiento
existente del tipo de datos varbinary (max). Cambia la forma en que se almacenan los datos BLOB: en
el sistema de archivos en lugar de en archivos de datos de SQL Server. Puesto que FILESTREAM se
implementa como una columna varbinary (max) y se integra directamente en el motor de base de datos,
la mayoría de las funciones y herramientas de administración de SQL Server funcionan para los datos de
FILESTREAM sin necesidad de realizar modificación alguna.
Hay que destacar que el comportamiento del tipo de datos varbinary (max) normal no ha cambiado en
SQL Server 2008, incluido el límite de tamaño de 2 GB. La incorporación del atributo FILESTREAM hace
que una columna varbinary (max) tenga básicamente un tamaño ilimitado (en realidad, el tamaño está
limitado al del volumen NTFS subyacente).
4
Los datos de FILESTREAM se almacenan en el sistema de archivos en un conjunto de directorios NTFS
denominados contenedores de datos, que corresponden a los grupos de archivos especiales de la base
de datos. El acceso transaccional a los datos de FILESTREAM está controlado por SQL Server y por un
controlador del filtro del sistema de archivos que se instala como parte de la habilitación de FILESTREAM
en el nivel de Windows. El uso de un controlador del filtro del sistema de archivos también permite el
acceso remoto a los datos de FILESTREAM a través de una ruta de acceso UNC. SQL Server mantiene
un vínculo de ordenaciones de filas de tabla a los archivos FILESTREAM asociados. Esto significa que si
se elimina o se cambia el nombre de algún archivo de FILESTREAM directamente a través del sistema
de archivos se dañará la base de datos.
El uso de FILESTREAM requiere varias modificaciones del esquema en las tablas de datos (especialmente,
el requisito de que cada fila debe tener un identificador de fila único) y tiene también algunas restricciones
cuando se combina con otras características (como la imposibilidad de cifrar datos de FILESTREAM).
Todo esto se describe con detalle en la sección "Configurar SQL Server para FILESTREAM", más
adelante en estas notas del producto.
Hay dos formas de obtener acceso a datos de FILESTREAM y manipularlos: con el modelo de
programación Transact-SQL estándar o mediante las API de transmisión por secuencias de Win32.
Ambos mecanismos reconocen totalmente las transacciones y admiten la mayoría de las operaciones
DML, incluidas la inserción, actualización, eliminación y selección. También se admiten datos de
FILESTREAM para operaciones de mantenimiento como copia de seguridad, restauración y comprobación
de coherencia. La principal excepción es que no se admiten actualizaciones parciales de los datos de
FILESTREAM. Cualquier actualización de un valor de datos de FILESTREAM se traduce en la creación
de una nueva copia del archivo de datos de FILESTREAM. El archivo anterior se quita de forma
asincrónica, como se describe en la sección "Configurar la recolección de elementos no utilizados de
FILESTREAM", más adelante en estas notas del producto.
Acceso a datos BLOB mediante el modelo de programación dual
Después de almacenar los datos en una columna FILESTREAM, se puede obtener acceso a ellos
mediante transacciones Transact-SQL o a través de las API de Win32. Esta sección ofrece algunos
detalles generales sobre los modelos de programación y su uso.
Acceso a Transact-SQL
Con Transact-SQL, es posible insertar, actualizar y eliminar datos de FILESTREAM de la manera siguiente:



5
Se pueden rellenar previamente campos de FILESTREAM mediante una operación de inserción
(con un valor vacío o un valor pequeño distinto de NULL). Sin embargo, las interfaces de Win32
constituyen una manera más eficiente de transmitir por secuencias una gran cantidad de datos.
Al actualizar datos de FILESTREAM, se modifican los datos BLOB subyacentes en el sistema de
archivos. Cuando un campo FILESTREAM está establecido en NULL, se eliminan los datos
BLOB asociados al campo. No se pueden usar actualizaciones fragmentadas de Transact-SQL
implementadas como UPDATE.Write() para realizar actualizaciones parciales en los datos de
FILESTREAM.
Cuando se elimina una fila que contiene datos de FILESTREAM, o cuando se elimina o se trunca
una tabla que contiene datos de FILESTREAM, también se eliminan los datos BLOB subyacentes
del sistema de archivos. La eliminación física real de los archivos de FILESTREAM es un
proceso asincrónico en segundo plano, como se explica en la sección "Configurar la recolección
de elementos no utilizados de FILESTREAM", más adelante en estas notas del producto.
Para obtener más información y ejemplos del uso de Transact-SQL para obtener acceso a datos
de FILESTREAM, vea el tema "Obtener acceso a datos FILESTREAM con Transact-SQL"
(http://msdn.microsoft.com/es-es/library/cc645962.aspx) en los Libros en pantalla de SQL Server 2008.
Acceso de transmisión por secuencias de Win32
Para permitir el acceso transaccional del sistema de archivos a los datos de FILESTREAM, una nueva
función intrínseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), proporciona el token que representa
la transacción actual a la que está asociada la sesión. Se debe haber iniciado la transacción y no haberse
confirmado ni revertido todavía. Al obtener un token, la aplicación enlaza las operaciones de transmisión
por secuencias del sistema de archivos de FILESTREAM con una transacción iniciada. La función devuelve
NULL en caso de que se no haya iniciado explícitamente ninguna transacción. Se debe obtener un token
para poder obtener acceso a archivos de FILESTREAM.
En FILESTREAM, el motor de base de datos controla el espacio de nombres del sistema de archivos
físico de BLOB. Una nueva función intrínseca, PathName, proporciona la ruta de acceso UNC lógica del
BLOB correspondiente a cada campo de FILESTREAM de la tabla. La aplicación usa esta ruta de acceso
lógica para obtener el identificador de Win32 y actuar sobre los datos BLOB mediante las interfaces
normales del sistema de archivos de Win32. La función devuelve NULL si el valor de la columna
FILESTREAM es NULL. Por tanto, se debe crear previamente un archivo de FILESTREAM para poder
obtener acceso a él en el nivel de Win32. Esto se hace como se ha descrito anteriormente.
La compatibilidad con la transmisión por secuencias de Win32 funciona en el contexto de una transacción
de SQL Server. Después de obtener un token de transacción y un nombre de ruta de acceso, se emplea
la API OpenSqlFilestream de Win32 para obtener un identificador de archivo de Win32. O bien, se puede
usar la API administrada SqlFileStream. Después, las interfaces de transmisión por secuencias de
Win32, como ReadFile() y WriteFile(), pueden usar este identificador para obtener acceso al archivo y
actualizarlo mediante el sistema de archivos. Una vez más, tenga en cuenta que los archivos de
FILESTREAM no se pueden eliminar directamente y no se puede cambiar su nombre con el sistema de
archivos. De lo contrario, se perderá la coherencia de nivel de vínculo entre la base de datos y el sistema
de archivos (es decir,
la base de datos resultará dañada).
El acceso del sistema de archivos de FILESTREAM modela una instrucción Transact-SQL mediante la
apertura y el cierre de archivos. La instrucción se inicia cuando se abre un identificador de archivo
y finaliza cuando se cierra el identificador. Por ejemplo, cuando se cierra un identificador de escritura,
se desencadenan todos los posibles desencadenadores AFTER que estén registrados en la tabla como
si se hubiera completado una instrucción UPDATE.
Para obtener más información y ejemplos del uso de las API de Win32 para obtener acceso a datos
de FILESTREAM, vea el tema "Crear aplicaciones cliente para datos FILESTREAM"
(http://msdn.microsoft.com/es-es/library/cc645940.aspx) en los Libros en pantalla de SQL Server 2008.
6
Semántica de transacciones
Se deben cerrar todos los identificadores de archivo antes de que la transacción se confirme o se
revierta. Si se queda abierto un identificador cuando se confirma una transacción, se produce un error en
la confirmación y todas las lecturas y escrituras adicionales del identificador provocan un error, como
cabría esperar. Entonces se debe revertir la transacción. Del mismo modo, si la base de datos o la
instancia del motor de base de datos se cierra, se invalidan todos los identificadores abiertos.
Siempre que se abre un archivo de FILESTREAM para una operación de escritura, se crea un nuevo
archivo de longitud cero y se escribe en él todo el valor de los datos actualizados de FILESTREAM.
El archivo anterior se quita de forma asincrónica, como se describe en la sección "Configurar la
recolección de elementos no utilizados de FILESTREAM", más adelante en estas notas del producto.
Con FILESTREAM, el motor de base de datos asegura la durabilidad de la transacción en la confirmación
de los datos BLOB de FILESTREAM que se modifican desde el acceso de transmisión por secuencias
del sistema de archivos. Para ello se emplea el registro de FILESTREAM mencionado anteriormente
y un vaciado explícito del contenido del archivo de FILESTREAM en el disco.
Semántica de aislamiento
La semántica de aislamiento se rige por los niveles de aislamiento de transacción del motor de base de
datos. Cuando se obtiene acceso a datos de FILESTREAM mediante las API de Win32, solo se admite el
nivel de aislamiento de lectura confirmada. El acceso a Transact-SQL también permite los niveles de
aislamiento de lectura repetible y serializable. Además, mediante el acceso a Transact-SQL, se permiten
lecturas de datos sucios en el nivel de aislamiento de lectura no confirmada, o la sugerencia de consulta
NOLOCK, pero dicho acceso no mostrará las actualizaciones en curso de datos de FILESTREAM.
Las operaciones de apertura de acceso al sistema de archivos no esperan ningún bloqueo. En su lugar,
se produce un error inmediato de las operaciones de apertura si no pueden obtener acceso a los datos
debido al aislamiento de transacción. Se produce un error en las llamadas de API de transmisión por
secuencias con ERROR_SHARING_VIOLATION si la operación de apertura no puede continuar debido
a la infracción de aislamiento.
Actualizaciones parciales
Para permitir que se realicen actualizaciones parciales, la aplicación puede emitir un control FS de
dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para capturar el contenido anterior
en el archivo al que hace referencia el identificador abierto. También se puede hacer mediante la API
administrada SqlFileStream con la marca ReadWrite. Esto desencadenará una copia del contenido
anterior en el lado servidor, como se ha explicado anteriormente. Para mejorar el rendimiento de la
aplicación y evitar posibles tiempos de espera mientras trabaja con archivos muy grandes, debe usar E/S
asincrónica.
Si se emite el FSCTL una vez que se ha escrito en el identificador, se conservará la última operación de
escritura y se perderán las escrituras anteriores realizadas en el identificador.
Para obtener más información sobre las actualizaciones parciales, vea el tema "Realizar actualizaciones
parciales de los datos FILESTREAM" (http://technet.microsoft.com/es-es/library/cc627407.aspx) en los
Libros en pantalla de SQL Server 2008.
7
Escritura continua desde clientes remotos
El acceso remoto del sistema de archivos a datos de FILESTREAM está habilitado a través del protocolo
Bloque de mensajes del servidor (SMB). Si el cliente es remoto, el almacenamiento en caché de las
operaciones de escritura depende de las opciones especificadas y de la API usada. Por ejemplo, el valor
predeterminado para las API de código nativo es realizar una escritura continua, mientras que en las API
administradas el valor predeterminado es usar el almacenamiento en búfer. Esta diferencia refleja los
comentarios de los clientes sobre las distintas API y sus usos en las versiones CTP de vista previa de
SQL Server 2008.
Se recomienda que las aplicaciones que se ejecutan en clientes remotos consoliden las pequeñas
operaciones de escritura (mediante almacenamiento en búfer) para realizar menos operaciones de
escritura con un tamaño de datos mayor. Además, si se emplea el almacenamiento en búfer, el cliente
debe emitir un vaciado explícito antes de que se confirme la transacción.
No se admite la creación de vistas asignadas a la memoria (E/S asignada a la memoria) usando un identificador
FILESTREAM. Si se usa la asignación en memoria para datos de FILESTREAM, el motor de base de
datos no puede garantizar la coherencia y la durabilidad de los datos o la integridad de la base de datos.
Cuándo se debe usar FILESTREAM
Aunque la tecnología FILESTREAM cuenta con muchas características atractivas, quizás no sea la
opción óptima en todas las situaciones. Como se ha mencionado anteriormente, el tamaño de los datos
BLOB y los patrones de acceso son los factores más importantes a la hora de decidir si los datos BLOB
se deben almacenar totalmente dentro de la base de datos o mediante FILESTREAM.
El tamaño afecta a lo siguiente:


Eficiencia del acceso a los datos BLOB mediante cualquier mecanismo de almacenamiento.
Como se ha mencionado anteriormente, el acceso de transmisión por secuencias a datos BLOB
grandes es más eficiente con FILESTREAM, pero las actualizaciones parciales son
(potencialmente mucho) más lentas.
Eficiencia de la copia de seguridad de los datos estructurados y BLOB combinados mediante
cualquier mecanismo de almacenamiento. Una copia de seguridad que combine archivos de
base de datos de SQL Server y un gran número de archivos de FILESTREAM será más lenta
que una copia de seguridad exclusivamente de archivos de base de datos de SQL Server de un
tamaño total equivalente. Esto se debe a la sobrecarga adicional que supone realizar una copia
de seguridad de cada archivo NTFS (una por cada valor de datos de FILESTREAM). Esta
sobrecarga es más evidente cuando los archivos de FILESTREAM son menores (ya que la
sobrecarga de tiempo se convierte en un porcentaje mayor del tiempo total de copia de seguridad
por MB de datos).
A modo de ejemplo, el gráfico siguiente muestra el rendimiento relativo de lecturas locales de diferentes
tamaños de datos de BLOB mediante varbinary(max), FILESTREAM mediante Transact-SQL
y FILESTREAM mediante NTFS. Se puede ver (en la línea azul) que el acceso Win32 de los datos de
FILESTREAM es varias veces más rápido que el acceso a Transact-SQL de datos varbinary(max)
a medida que el tamaño de los datos aumenta. Tenga en cuenta que las medidas de rendimiento están
en megabits por segundo (Mbps).
8
Ilustración 1: rendimiento de lectura de diferentes tamaños de BLOB
Las cifras de NTFS incluyen el tiempo necesario para iniciar una transacción, recuperar el nombre de la
ruta de acceso y el contexto de la transacción de SQL Server, y abrir un identificador de Win32 para los
datos de FILESTREAM. Todas las pruebas se realizaron usando el mismo equipo con cuatro núcleos de
procesador y un grupo de búferes activo de SQL Server.
El otro factor que hay que tener en cuenta es si se puede escribir en el cliente o en el nivel intermedio
(o si se puede modificar) para usar las API de transmisión por secuencias de Win32 y el acceso normal
a SQL Server. Si no se puede, FILESTREAM no resultará adecuado, ya que el máximo rendimiento se
obtiene cuando se usan las API de transmisión por secuencias de Win32.
Configurar Windows para FILESTREAM
Como ocurre con cualquier otra implementación, antes de implementar una aplicación que usa
FILESTREAM es importante preparar el servidor Windows que hospedará la base de datos de SQL
Server y los contenedores de datos de FILESTREAM asociados. En esta sección se explica cómo
configurar el hardware de almacenamiento y el sistema de archivos NTFS como preparación para el uso
de FILESTREAM. Después se muestra cómo habilitar FILESTREAM en el nivel de Windows.
Selección y configuración de hardware
Una de las causas más frecuentes de una carga de trabajo con un rendimiento bajo es una configuración
de hardware inadecuada. A veces la causa es una memoria insuficiente, lo que conduce a "paginar
excesivamente" el grupo de búferes de SQL Server, y en otras ocasiones es simplemente que el
hardware de almacenamiento no tiene la capacidad de rendimiento de E/S que la carga de trabajo
necesita. En el caso de las aplicaciones que usarán FILESTREAM para la transmisión por secuencias de
alto rendimiento de datos BLOB mediante las API de Win32, la elección y la configuración del hardware
de almacenamiento son fundamentales.
9
En las próximas secciones se describen algunas prácticas recomendadas para la elección y el diseño del
almacenamiento. Para obtener una explicación más detallada al respecto, vea las notas del producto de
TechNet "Diseño del almacenamiento de la base de datos física" (http://www.microsoft.com/technet/
prodtechnol/sql/2005/physdbstor.mspx). Después de realizar un diseño óptimo, es conveniente realizar
pruebas de carga para validar la capacidad de rendimiento del subsistema de E/S. Esto se describe en
detalle en el artículo de prácticas recomendadas de SQL Server en TechNet "Prácticas recomendadas
de E/S antes de la implementación" (http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/
pdpliobp.mspx).
Diseño del almacenamiento físico
Asegúrese de tener en cuenta la carga de trabajo prevista en un contenedor de datos de FILESTREAM
cuando decida dónde se debe colocar, así como las cargas de trabajo de los contenedores de datos
o los archivos de SQL Server colocados. Puede que cada contenedor de datos de FILESTREAM necesite
estar en su propio volumen, ya que el hecho de tener varios contenedores de datos con cargas de trabajo
elevadas en un único volumen puede producir contención.
Lo importante aquí es que si no se piensa en las cargas de trabajo implicadas, poner todo en un mismo
volumen puede producir problemas de rendimiento. El grado de separación necesario variará de un
cliente a otro.
También es posible crear un esquema de tabla dentro de SQL Server que permita el equilibrio de carga
de los datos de FILESTREAM entre varios volúmenes. Esto se describe en la sección "Equilibrio de
carga de datos de FILESTREAM".
Elección del nivel RAID
Las ventajas de emplear la tecnología RAID son ampliamente conocidas, y se ha escrito mucho sobre la
elección de un nivel RAID adecuado para los requisitos de la aplicación, por lo que estas notas del producto
no intentarán repetir toda esa información. Las notas del producto "Diseño del almacenamiento de la base
de datos física" mencionadas anteriormente incluyen una sección excelente sobre los niveles RAID y la
elección del nivel RAID. A continuación se ofrece información general simple sobre los factores que hay
que tener en cuenta.
Los niveles RAID difieren de diversas maneras, especialmente en cuanto a rendimiento de lectura
y escritura, resistencia a errores y costo. Por ejemplo, RAID 5 es relativamente económico, puede
controlar el error de solo una unidad de la matriz RAID y puede resultar inadecuado para cargas de
trabajo con muchas escrituras. Por otra parte, RAID 10 proporciona un rendimiento excelente de lectura
y escritura, y puede controlar errores en varias unidades (en función del grado de creación de reflejo
presente), pero es más costoso, ya que al menos el 50 por ciento de las unidades de la matriz RAID son
redundantes. Estos son los tres factores principales que influyen en la elección de un nivel RAID. El nivel
RAID elegido puede ser diferente para el volumen en el que se almacenan todas las bases de datos de
usuario, y puede ser distinto incluso entre el volumen que almacena los archivos de datos y el que
almacena los archivos de registro para una sola base de datos.
Si la carga de trabajo va a implicar transmisión por secuencias de alto rendimiento de datos de
FILESTREAM, la elección inmediata puede ser que el volumen del contenedor de datos de FILESTREAM
use el nivel RAID que proporciona el mayor rendimiento de lectura. Sin embargo, esto quizás no proporcione
un alto grado de resistencia ante errores. Por otra parte, la elección inmediata puede ser usar el mismo
nivel RAID que para los demás volúmenes que almacenan los datos para la base de datos, pero esto
quizás no proporcione los niveles de rendimiento que la carga de trabajo demanda.
10
En estas notas del producto, queremos destacar que se debe realizar una elección consciente del nivel
RAID para los volúmenes de contenedores de datos de FILESTREAM después de evaluar las ventajas
y las desventajas, no decidir basándose en un único factor.
Elección de la interfaz de unidad
En las bases de datos típicas que tienen datos BLOB, el tamaño total de los datos BLOB puede ser
muchas veces mayor que el tamaño total de los datos estructurados. Al implementar una solución
que implica almacenar los datos de FILESTREAM en volúmenes diferentes, quizás desee usar un
almacenamiento más barato para el volumen, como IDE o SATA (en lo sucesivo denominado
simplemente "SATA"), en lugar de un almacenamiento SCSI más costoso. Antes de tomar esta decisión,
hay que entender las ventajas y desventajas que ello implica. Esta sección proporciona información
general de las distintas características de SCSI frente a IDE/SATA para que pueda tomar una decisión
informada basándose en el rendimiento, la confiabilidad y el costo.
Capacidad y rendimiento
Las unidades SATA suelen tener más capacidad que las unidades SCSI, pero tienen una velocidad
de giro (RPM) menor que las unidades SCSI. Si bien hay algunas unidades SATA de 10.000 RPM,
la mayoría son de 5.400 o 7.200 RPM. Existen unidades SCSI de alto rendimiento de 10.000 y hasta
15.000 RPM. Aunque RPM puede ser una métrica de comparación útil, las dos cifras que se deben usar
realmente para realizar una comparación son la latencia (el tiempo que transcurre hasta que el cabezal
del disco se encuentra en la posición adecuada sobre la superficie del disco) y las velocidades de
transferencia medias (cuántos datos se puede transferir hacia y desde la superficie del disco por
segundo). También es importante que las unidades puedan procesar patrones complejos de E/S de
forma eficiente. A la hora de elegir las unidades, asegúrese de que las unidades SATA admitan Native
Command Queue (NCQ) y las unidades SCSI admitan Command Tag Queue (CTQ), lo que les permite
procesar varias E/S de disco intercaladas para lograr un mejor rendimiento.
En resumen, las unidades SCSI suelen tener mejor latencia y velocidades de transferencia, por lo que
proporcionarán mejor rendimiento de transmisión de datos, pero posiblemente a un costo mayor.
Confiabilidad
SQL Server emplea la ordenación de escritura garantizada y la durabilidad para proporcionar confiabilidad
y capacidad de recuperación gracias a su mecanismo de registro de escritura previa. Para obtener más
información sobre estos requisitos de E/S, vea las notas del producto de TechNet "Conceptos básicos de
E/S de SQL Server" (http://www.microsoft.com/technet/prodtechnol/sql/2005/iobasics.mspx).
En cuanto a confiabilidad, SCSI suele ser mejor que SATA porque admite de forma uniforme la escritura
forzada de datos en el disco mientras que SATA no lo admite. Esto se consigue admitiendo la escritura
continua, donde los datos que se van a escribir no se almacenan en memoria caché, o admitiendo el
vaciado forzoso del contenido de la memoria caché en el disco. La falta de cualquiera de estos
mecanismos puede afectar a la capacidad de recuperación después de un error de hardware, de
software o de alimentación. Todos los tipos de interfaces pueden admitir el intercambio en caliente para
permitir reparaciones mientras se mantiene la disponibilidad.
La característica FILESTREAM se basa en dos garantías de ordenación de escritura y durabilidad:


11
Durabilidad de los datos en tiempo de confirmación de la transacción
Registro de escritura previa para la creación y eliminación de archivos de FILESTREAM
Para lograr durabilidad de los datos, el controlador del sistema de archivos de FILESTREAM emite un
vaciado explícito de los archivos que se han modificado antes de que se confirme una transacción (los
detalles del mecanismo quedan fuera del ámbito de estas notas del producto). Esto garantiza que en
caso de que se produzca un error de alimentación, los discos que no tienen suficiente memoria caché
alimentada por batería no perderán los datos de FILESTREAM confirmados pero sin vaciar. Si las
unidades SATA no admiten una operación de vaciado forzado, se puede ver afectada la capacidad de
recuperación y se pueden perder datos.
El registro de escritura previa se basa en la coherencia de los metadatos NTFS. Esto por sí solo depende
de la confiabilidad de las unidades subyacentes. No hay ningún problema con SCSI, pero si las unidades
SATA no admiten el vaciado forzado, se pueden perder algunos cambios en los metadatos NTFS si se
produce una situación de error de alimentación. Esto puede dar lugar a varios escenarios:



NTFS no puede recuperarse y el volumen no se puede montar (es decir, el contenedor de datos
de FILESTREAM está básicamente sin conexión).
NTFS se recupera pero los cambios de los metadatos NTFS se pierden y SQL Server no puede
revertir una transacción sin confirmar que realiza una inserción de datos de FILESTREAM (es
decir, los datos de FILESTREAM se "pierden").
NTFS se recupera pero los cambios de los metadatos NTFS se pierden y SQL Server no puede
revertir una transacción sin confirmar que realiza una eliminación de datos de FILESTREAM (es
decir, los datos de FILESTREAM se pierden).
Hay que destacar que estos tres escenarios no son peores que si los datos BLOB se almacenaran fuera
de la base de datos en un volumen NTFS con unidades SATA subyacentes que no admitieran el
almacenamiento forzado de datos en el disco. El uso de FILESTREAM en un volumen con unidades
SATA subyacentes en este caso es realmente mejor que almacenar los datos BLOB en archivos NTFS
sin formato en el mismo volumen, ya que la coherencia del nivel de vínculo de FILESTREAM proporciona
un mecanismo para detectar cuándo se han producido esos "daños" (mediante la ejecución de DBCC
CHECKDB en la base de datos).
En resumen, los datos de FILESTREAM se pueden almacenar de forma confiable en volúmenes con
almacenamiento SATA subyacente, siempre y cuando las unidades SATA admitan el almacenamiento
forzado de datos en el disco mediante el vaciado de la memoria caché.
Configuración de NTFS
Incluso el subsistema de E/S mejor diseñado, cuando se ejecuta en hardware de alto rendimiento, puede
que no funcione de la manera deseada si el sistema de archivos (en este caso, NTFS) no está configurado
correctamente. En esta sección se describen algunas de las opciones de configuración que pueden
afectar a una carga de trabajo en la que participan datos de FILESTREAM.
Para obtener información general más completa sobre NTFS, vea los artículos de TechNet Library
"Referencia técnica de NTFS" (http://technet.microsoft.com/es-es/library/cc758691.aspx) y "Trabajar con
sistemas de archivos" (http://technet.microsoft.com/es-es/library/bb457112.aspx).
12
Optimizar el rendimiento de NTFS
De forma predeterminada, NTFS no está configurado para controlar una carga de trabajo de alto
rendimiento con decenas de miles de archivos en un directorio individual del sistema de archivos
(es decir, el escenario de FILESTREAM). Hay dos opciones de NTFS que es necesario configurar para
facilitar el rendimiento de FILESTREAM. Es especialmente importante establecer estas opciones
correctamente antes de iniciar cualquier simulación de rendimiento; de lo contrario, los resultados no
serán representativos del rendimiento real de FILESTREAM.
La primera opción de configuración consiste en deshabilitar la generación de nombres 8.3 cuando se
crean nuevos archivos (o se cambian de nombre). Este proceso genera un nombre secundario para cada
archivo que solo sirve por compatibilidad con versiones anteriores para las aplicaciones de 16 bits.
El algoritmo genera un nuevo nombre 8.3 y después tiene que examinar todos los nombres de archivo
con formato 8.3 existentes en el directorio para asegurarse de que el nuevo nombre es único. A medida
que el número de archivos del directorio aumenta (normalmente por encima de 300.000), este proceso
lleva cada vez más tiempo. El tiempo necesario para crear un archivo aumenta y el rendimiento disminuye,
por lo que desactivar este proceso puede mejorar considerablemente el rendimiento. Para desactivar
este proceso, escriba lo siguiente en un símbolo del sistema y reinicie el equipo:
fsutil behavior set disable8dot3 1
Nota: esta opción deshabilita la generación de nombres 8.3 en todos los volúmenes NTFS del servidor.
Si hay aplicaciones de 16 bits que usan algunos volúmenes, pueden experimentar problemas después
de cambiar este comportamiento.
La segunda opción que hay que desactivar es la actualización de la hora de último acceso a un archivo
cuando se obtiene acceso al mismo. Si la carga de trabajo tiene acceso brevemente a muchos archivos,
se dedica una cantidad de tiempo desproporcionada actualizando simplemente la hora de último acceso
de cada archivo. Al desactivar esta opción también aumenta considerablemente el rendimiento. Para
desactivar este proceso, escriba lo siguiente en un símbolo del sistema y reinicie el equipo:
fsutil behavior set disablelastaccess 1
Tamaño de clúster
Todos los sistemas de archivos de Windows tienen el concepto de "clúster", que es la unidad de asignación
cuando se asigna espacio en disco. Como un clúster es la menor cantidad de espacio en disco que se
puede asignar, si un archivo es muy pequeño, parte del clúster puede quedar sin utilizar (se desperdicia).
Por tanto, el tamaño de clúster suele ser bastante reducido para que los archivos pequeños no
desaprovechen espacio en disco.
Los archivos grandes pueden tener asignados muchos clústeres o los archivos pueden crecer con el
tiempo y asignárseles clústeres a medida que crecen. Si un archivo crece mucho, pero en fragmentos
pequeños, es probable que los clústeres asignados no sean contiguos en el disco (es decir, sean
"fragmentos"). Esto significa que cuanto menores sean los clústeres y cuanto más crezca un archivo,
más "fragmentado" estará.
Por tanto, el tamaño de clúster es un compromiso entre desaprovechar espacio en disco y reducir la
fragmentación. Puede encontrar información más detallada sobre los diversos tamaños de clúster de los
sistemas de archivos de Windows en el artículo de Knowledge Base "Tamaño de clúster predeterminado
para FAT y NTFS" (http://support.microsoft.com/kb/140365).
13
La recomendación para usar FILESTREAM es que las unidades individuales de datos BLOB tengan un
tamaño de 1 MB o superior. Si es así, se recomienda que el tamaño de clúster de NTFS para el volumen
del contenedor de datos de FILESTREAM se establezca en 64 kB para reducir la fragmentación.
Se debe hacer manualmente porque el valor predeterminado para los volúmenes NTFS de hasta 2 terabytes
(TB) es de 4 kB. Para ello se usa la opción /A del comando format. Por ejemplo, escriba lo siguiente en
un símbolo del sistema:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:64K
Este valor se debe combinar con tamaños de búfer grandes, como se describe en la sección
"Consideraciones sobre la optimización del rendimiento y las simulaciones", más adelante en estas notas
del producto.
Administrar la fragmentación
Como se ha descrito anteriormente, cuando muchos archivos de un volumen crecen, se fragmentan.
Esto significa que la colección de clústeres asignados al archivo no es contigua. Cuando el archivo se lee
secuencialmente, los cabezales del disco necesitan leer todos los clústeres en orden, lo que puede
significar que tienen que leer partes diferentes del disco. Aunque los archivos no crezcan una vez
creados, si se crearon en un volumen en el que el espacio disponible no está en un único fragmento
contiguo, se pueden fragmentar inmediatamente, ya que los clústeres necesarios para alojarlos no están
disponibles de forma contigua.
Esta fragmentación hace que el rendimiento de lectura secuencial sea menor que cuando no hay
fragmentación (o cuando hay poca). El problema es muy similar al de la fragmentación de índices dentro
de una base de datos que disminuye el rendimiento del recorrido de intervalos de consulta.
Por tanto, es esencial quitar periódicamente la fragmentación mediante una herramienta de
desfragmentación de disco para mantener el rendimiento de lectura secuencial. Además, si el volumen
que se va a usar para hospedar el contenedor de datos de FILESTREAM se usó previamente, o si todavía
contiene otros datos, se debe comprobar el nivel de fragmentación y corregir en caso de que sea necesario.
Compresión
Los datos almacenados en NTFS se pueden comprimir para ahorrar espacio en disco, pero a costa de
un uso adicional de la CPU para comprimir y descomprimir los datos cuando se escriben o se leen,
respectivamente. La compresión tampoco es útil si los datos no se pueden comprimir. Por ejemplo, los
datos aleatorios, los datos cifrados o los datos que ya se han comprimido no se comprimen bien, pero
aun así se deben seguir pasando por el algoritmo de compresión de NTFS, lo que produce una
sobrecarga de la CPU.
Por estos motivos, solo tiene sentido habilitar la compresión cuando los datos se puedan comprimir
mucho y cuando la CPU adicional necesaria no haga que disminuya el rendimiento de la carga de
trabajo. También hay que tener en cuenta que la compresión solo se pueden habilitar cuando el tamaño
de clúster de NTFS es 4.096 bytes o menos.
La compresión se puede habilitar en el volumen del contenedor de datos de FILESTREAM cuando se
formatea, mediante la opción /C del comando format. Por ejemplo:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:4096 /C
14
También se puede habilitar la compresión en un volumen existente siguiendo estos pasos:
1. En Mi PC o en el Explorador de Windows, haga clic con el botón secundario en el volumen que
desee comprimir o descomprimir.
2. Haga clic en Propiedades para ver el cuadro de diálogo Propiedades.
3. En la pestaña General, active o desactive la casilla Comprimir contenido para ahorrar
espacio en disco y haga clic en Aceptar.
4. En el cuadro de diálogo Confirmar cambios de atributos, seleccione si desea que la
compresión se aplique a todo el volumen o solo a la carpeta raíz.
Esto se muestra en la ilustración siguiente.
Ilustración 2: comprimir un volumen existente mediante el Explorador de Windows
15
Administración del espacio
Si bien es posible colocar varios contenedores de datos de FILESTREAM en un único volumen NTFS,
hay motivos para tener una asignación 1:1 entre los contenedores de datos y los volúmenes NTFS.
Aparte de la posible contención dependiente de la carga de trabajo, no hay ninguna manera de
administrar el uso del espacio del contenedor de datos de FILESTREAM desde dentro de SQL Server,
por lo que hay que usar cuotas de disco de NTFS si es necesario. El seguimiento de las cuotas de disco
se realiza por usuario y por volumen, por lo que si se tienen varios contenedores de datos de FILESTREAM
en un único volumen resulta difícil saber qué contenedor de datos usa más espacio en disco. Todos los
archivos de FILESTREAM se crearán bajo la cuenta de servicio de SQL Server. Si se cambia esto,
el espacio en disco empezará a cargarse a la nueva cuenta de servicio.
Hay un único controlador del filtro del sistema de archivos de FILESTREAM para cada volumen NTFS
que tiene un contenedor de datos de FILESTREAM, y también hay uno para cada versión de SQL Server
que tiene un contenedor de datos de FILESTREAM en el volumen. Cada controlador del filtro es responsable
de administrar todos los contenedores de datos de FILESTREAM de ese volumen, para todas las instancias
que usan una versión específica de SQL Server.
Por ejemplo, un volumen NTFS que hospeda tres contenedores de datos de FILESTREAM, uno para
cada una de tres instancias de SQL Server 2008, solo tendrá un controlador del filtro del sistema de
archivos de FILESTREAM de SQL Server 2008.
Seguridad
Existen dos requisitos de seguridad para usar la característica FILESTREAM. En primer lugar, se debe
configurar SQL Server para la seguridad integrada. En segundo lugar, si se va a usar acceso remoto,
se debe habilitar el puerto SMB (445) a través de cualquier sistema de firewall. Esto también es
necesario para el acceso normal a recursos compartidos remotos. Para obtener más información, vea el
artículo de Knowledge Base "Información general de los servicios y los requisitos de puerto de red para
Windows Server System" (http://support.microsoft.com/kb/832017).
Consideraciones sobre software antivirus
El software antivirus es ubicuo en el entorno de hoy en día. FILESTREAM no puede impedir que el
software antivirus examine los archivos del contenedor de datos de FILESTREAM (esto crearía problemas
de seguridad). El software normalmente tiene una configuración de directiva sobre lo que se debe hacer
con un archivo sospechoso de estar contaminado con un virus: eliminar el archivo o restringir el acceso
al mismo (lo que se conoce como poner el archivo en "cuarentena"). En ambos casos, se impedirá el
acceso a los datos BLOB del archivo afectado y SQL Server pensará que el archivo se ha eliminado.
Se recomienda que configure el software antivirus para que ponga en cuarentena los archivos, no para
que los elimine. Se puede usar DBCC CHECKDB dentro de SQL Server para averiguar qué archivos
parecen faltar y el administrador de Windows puede correlacionar los nombres de archivo con el registro
del software antivirus y realizar la acción necesaria.
16
Habilitar FILESTREAM en Windows
FILESTREAM es una característica híbrida que requiere que tanto el administrador de Windows como el
administrador de SQL Server realicen algunas acciones antes de que se habilite la característica. Esto es
necesario para mantener la separación de tareas entre los dos administradores, especialmente si el
administrador de SQL Server no es también el administrador de Windows. Al habilitar FILESTREAM en
el nivel de Windows se instala un controlador del filtro del sistema de archivos, que es algo para lo que
solo un administrador de Windows tiene privilegios.
En el nivel de Windows, FILESTREAM se habilita durante la instalación de SQL Server 2008 o mediante
la ejecución del Administrador de configuración de SQL Server. He aquí los pasos que hay que seguir:
1.
2.
3.
4.
5.
6.
7.
8.
9.
En el menú Inicio, seleccione Todos los programas, seleccione Microsoft SQL Server 2008,
seleccione Herramientas de configuración y, a continuación, haga clic en Administrador
de configuración de SQL Server.
En la lista de servicios, haga clic con el botón secundario en Servicios de SQL Server y,
a continuación, haga clic en Abrir.
En el complemento Administrador de configuración de SQL Server, busque la instancia
de SQL Server en la que desee habilitar FILESTREAM.
Haga clic con el botón secundario en la instancia y, a continuación, haga clic en Propiedades.
En el cuadro de diálogo Propiedades de SQL Server, haga clic en la pestaña FILESTREAM.
Active la casilla Habilitar FILESTREAM para acceso a Transact-SQL.
Si desea leer y escribir datos de FILESTREAM desde Windows, haga clic en Habilitar
FILESTREAM para el acceso de transmisión por secuencias de E/S de archivos.
Escriba el nombre del recurso compartido de Windows en el cuadro Nombre de recurso
compartido de Windows.
Si los clientes remotos deben tener acceso a los datos de FILESTREAM que están
almacenados en este recurso compartido, seleccione Permitir que los clientes remotos
tengan acceso de transmisión por secuencias a los datos de FILESTREAM.
Haga clic en Aplicar.
En la ilustración siguiente se muestra la pestaña FILESTREAM como se describe en el procedimiento.
17
Ilustración 3: configurar FILESTREAM mediante el Administrador de configuración de SQL Server
Este procedimiento debe realizarse para cada instancia de SQL Server que vaya a usar la característica
FILESTREAM antes de que la pueda usar SQL Server. No hay ningún especificación del contenedor de
datos de FILESTREAM en esta fase; esto se realiza cuando se crea un grupo de archivos de FILESTREAM
en una base de datos después de que se haya habilitado FILESTREAM dentro de SQL Server.
Tenga en cuenta que es posible deshabilitar el acceso de FILESTREAM en el nivel de Windows incluso
aunque SQL Server lo haya habilitado. En ese caso, después de reiniciar la instancia de SQL Server,
todos los datos de FILESTREAM no estarán disponibles. Se mostrará la advertencia siguiente.
Ilustración 4: advertencia que se muestra al deshabilitar FILESTREAM con el Administrador de
configuración de SQL Server
18
Configurar SQL Server para FILESTREAM
Cada instancia de SQL Server que vaya a usar la característica FILESTREAM se debe configurar por
separado, tanto en el nivel de Windows como en el de SQL Server. Después de habilitar FILESTREAM,
se debe configurar una base de datos para almacenar datos de FILESTREAM y solo entonces se pueden
definir las tablas que incluyen columnas FILESTREAM. En esta sección se describe cómo configurar
FILESTREAM en el nivel de SQL Server y cómo crear bases de datos y tablas habilitadas para
FILESTREAM, y se explica la interacción de FILESTREAM con otras características de SQL Server 2008.
Consideraciones sobre la seguridad
FILESTREAM requiere el uso de seguridad integrada (es decir, autenticación de Windows). Cuando una
aplicación que usa Win32 intenta obtener acceso a datos de FILESTREAM, el usuario de Windows se
valida mediante SQL Server. Si el usuario tiene acceso de Transact-SQL a los datos de FILESTREAM,
el acceso se concederá también en el nivel de Win32, siempre y cuando el token de transacción se
obtenga en el contexto de seguridad del usuario de Windows que está abriendo el archivo.
El requisito de la autenticación de Windows procede de la naturaleza de las API de E/S de archivos de
Windows. La única manera de pasar la identidad del cliente desde la aplicación cliente a SQL Server durante
una operación de E/S de archivos es usar el token de Windows asociado al subproceso del cliente.
Cuando se crea el contenedor de datos de FILESTREAM, se protege automáticamente de forma que
solo la cuenta de servicio de SQL Server y los miembros del grupo BUILTIN/Administradores puedan
obtener acceso al árbol de directorios del contenedor de datos. Hay que tener cuidado de que el contenido
del contenedor de datos nunca cambie excepto mediante métodos transaccionales admitidos, ya que el
cambio mediante otros métodos hará que el contenedor resulte dañado.
Habilitar FILESTREAM en SQL Server
El segundo paso para habilitar FILESTREAM se realiza dentro de la instancia de SQL Server 2008. No
se debe hacer hasta que FILESTREAM se haya habilitado en el nivel de Windows y el volumen NTFS
que almacenará los datos de FILESTREAM se haya preparado correctamente (como se ha descrito en la
sección "Configurar Windows para FILESTREAM" anteriormente).
El acceso a FILESTREAM se controla dentro de SQL Server mediante sp_configure para establecer la
opción de configuración filestream_access_level en uno de tres valores posibles. Los valores posibles son:



0: deshabilitar la compatibilidad de FILESTREAM con esta instancia
1: habilitar FILESTREAM para el acceso a Transact-SQL solamente
2: habilitar FILESTREAM para el acceso a Transact-SQL y de transmisión por secuencias de Win32
En el ejemplo siguiente se muestra cómo habilitar FILESTREAM para el acceso a Transact-SQL y de
transmisión por secuencias de Win32.
EXEC sp_configure filestream_access_level, 2;
GO
RECONFIGURE;
GO
19
La instrucción RECONFIGURE es necesaria para que el valor recién configurado surta efecto. Tenga en
cuenta que si FILESTREAM no se ha habilitado en el nivel de Windows, no se habilitará en el nivel de
SQL Server cuando se ejecute el código anterior. El valor configurado actual se puede averiguar
mediante el código siguiente.
EXEC sp_configure filestream_access_level;
GO
Si FILESTREAM no está configurado en el nivel de Windows, el "config_value" (valor de configuración)
del resultado de sp_configure será diferente (es decir, 0) del "run_value" (valor de ejecución) después
de haberse ejecutado la instrucción RECONFIGURE.
Crear una base de datos habilitada para FILESTREAM
Una vez que FILESTREAM está habilitado en los niveles de Windows y SQL Server, se puede definir un
contenedor de datos de FILESTREAM. Para ello se define un grupo de archivos de FILESTREAM en
una base de datos. Hay una asignación 1:1 entre los grupos de archivos de FILESTREAM y los
contenedores de datos de FILESTREAM.
Un grupo de archivos de FILESTREAM se puede definir cuando se crea una base de datos o se puede
crear por separado mediante una instrucción ALTER DATABASE. En el ejemplo siguiente se crea un
grupo de archivos de FILESTREAM en una base de datos existente.
ALTER DATABASE Production ADD
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM;
GO
La cláusula CONTAINS FILESTREAM es necesaria para diferenciar el nuevo grupo de archivos de los
grupos de archivos normales de la base de datos. Si la característica FILESTREAM está deshabilitada,
esta instrucción producirá el error siguiente.
Mensaje 5591, nivel 16, estado 3, línea 1
La característica FILESTREAM está deshabilitada.
20
Suponiendo que FILESTREAM esté habilitado en los niveles de Windows y de SQL Server, se creará el
grupo de archivos. En este momento, el contenedor de datos de FILESTREAM se define agregando un
único archivo al grupo de archivos. El nombre de la ruta de acceso especificado es el nombre de la ruta
de acceso del directorio que se creará como raíz del contenedor de datos. El nombre completo de la ruta
de acceso hasta el nombre del directorio final, sin incluirlo, debe existir ya. En el ejemplo siguiente se
define el contenedor de datos para el grupo de archivos FileStreamGroup1 creado anteriormente.
ALTER DATABASE Production ADD FILE (
NAME = FSGroup1File,
FILENAME = 'F:\Production\FSDATA')
TO FILEGROUP FileStreamGroup1;
GO
Ahora se creará el directorio FSDATA. Solo contendrá dos elementos:


El archivo filestream.hdr. Son los metadatos de FILESTREAM para el contenedor de datos.
El directorio $FSLOG. Es el equivalente en FILESTREAM del registro de transacciones de una
base de datos.
Hay que tener en cuenta que una base de datos puede tener varios grupos de archivos de
FILESTREAM. Esto puede resultar útil para separar el almacenamiento de BLOB para varias tablas de la
base de datos.
Crear una tabla para almacenar datos de FILESTREAM
Una vez que la base de datos tiene un grupo de archivos de FILESTREAM, se pueden crear tablas que
contengan columnas FILESTREAM. Como se ha mencionado anteriormente, una columna FILESTREAM
se define como una columna varbinary(max) que tiene el atributo FILESTREAM. En el código siguiente
se crea una tabla con una sola columna FILESTREAM.
USE Production;
GO
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID ())
21
FILESTREAM_ON FileStreamGroup1;
GO
Una tabla puede tener varias columnas FILESTREAM, pero los datos de todas las columnas
FILESTREAM de una tabla deben almacenarse en el mismo grupo de archivos de FILESTREAM. Si no
se especifica la cláusula FILESTREAM_ON, se usará el grupo de archivos de FILESTREAM que esté
configurado como el predeterminado. Esto podría no ser la configuración deseada y producir problemas
de rendimiento.
Una vez creada la tabla, el contenedor de datos de FILESTREAM contendrá otro directorio,
correspondiente a la tabla, con un subdirectorio que corresponde a la columna FILESTREAM de la tabla.
Este subdirectorio contendrá los archivos de datos una vez introducidos los datos en la tabla. La estructura
de directorios variará según el número de columnas FILESTREAM que tenga una tabla y si la tabla está
particionada o no.
Tenga en cuenta que para que una tabla tenga una o varias columnas FILESTREAM, debe tener también
una columna del tipo de datos uniqueidentifier con el atributo ROWGUIDCOL. Esta columna no debe
permitir valores NULL y debe tener una restricción de columna única UNIQUE o PRIMARY KEY . El valor
GUID de la columna lo suministrar una aplicación al insertar datos o una restricción DEFAULT que use la
función NEWID() (o NEWSEQUENTIALID() si se ha configurado la replicación de mezcla, como se indica
en la sección "Combinaciones de características y restricciones" más adelante).
Para obtener más información sobre los detalles y las restricciones del esquema de tabla y las opciones
necesarias, vea el tema "CREATE TABLE (Transact-SQL)" (http://msdn.microsoft.com/es-es/library/
ms174979.aspx) en los Libros pantalla de SQL Server 2008.
Configurar la recolección de elementos no utilizados de FILESTREAM
Los archivos de datos de FILESTREAM del contenedor de datos de FILESTREAM no se pueden
actualizar parcialmente. Esto significa que cualquier cambio realizado en los datos BLOB de la columna
FILESTREAM creará un archivo de datos de FILESTREAM nuevo. El archivo "anterior" se conservará hasta
que ya no sea necesario para recuperar la base de datos. Los archivos que representan datos de FILESTREAM
eliminados, o inserciones revertidas de datos de FILESTREAM, se conservan de manera similar.
El proceso de recolección de elementos no utilizados quita los archivos que ya no se necesitan. Este
proceso es automático, a diferencia de lo que ocurre en Windows SharePoint® Services, donde la
recolección de elementos no utilizados se debe implementar manualmente en el almacén externo de BLOB.
A todas las operaciones de archivos de FILESTREAM se les asigna un número de secuencia de registro
(LSN) en el registro de transacciones de la base de datos. Siempre y cuando el registro de transacciones
se trunque más allá del LSN de la operación de FILESTREAM, el archivo ya no será necesario y puede
ser objeto de la recolección de elementos no utilizados. Por tanto, todo lo que pueda evitar el truncamiento
del registro de transacciones también puede impedir la eliminación física de un archivo de FILESTREAM.
He aquí algunos ejemplos:



22
No se han realizado copias de seguridad de registros en el modelo de recuperación FULL
o BULK_LOGGED.
Hay una transacción activa de ejecución prolongada.
El trabajo del lector del registro de replicación no se ha ejecutado.
La recolección de elementos no utilizados de FILESTREAM es una tarea en segundo plano desencadenada
por el proceso de punto de comprobación de la base de datos. Se ejecuta automáticamente un punto de
comprobación cuando se ha generado una cantidad suficiente de registros de transacciones. Para
obtener más información, vea el tema "Puntos de comprobación de base de datos (SQL Server)"
(http://msdn.microsoft.com/es-es/library/ms189573.aspx) en los Libros en pantalla de SQL Server 2008.
Puesto que las operaciones de archivos de FILESTREAM se graban mínimamente en el registro de
transacciones de la base de datos, puede pasar bastante tiempo hasta que el número de entradas del
registro de transacciones generadas desencadene un proceso de punto de comprobación y se produzca
la recolección de elementos no utilizados. Si esto supone algún problema, puede forzar la recolección de
elementos no utilizados mediante la instrucción CHECKPOINT.
Consideraciones sobre la creación de particiones
Si la tabla que contiene datos de FILESTREAM tiene particiones, la cláusula FILESTREAM_ON debe
especificar un esquema de partición para los grupos de archivos de FILESTREAM basado en la función
de partición de la tabla. Esto es necesario porque el esquema de partición normal implicará los grupos de
archivos normales que no se pueden usar para almacenar datos de FILESTREAM. La definición de la
tabla (en una instrucción CREATE TABLE o CREATE CLUSTERED INDEX…WITH DROP_EXISTING)
especifica después ambos esquemas de partición.
El esquema de partición de FILESTREAM puede especificar que todas las particiones se asignen a un
único grupo de archivos, pero no se recomienda porque puede causar problemas de rendimiento.
En el ejemplo siguiente se muestra esta sintaxis.
CREATE PARTITION FUNCTION DocPartFunction (INT)
AS RANGE RIGHT FOR VALUES (100000, 200000);
GO
CREATE PARTITION SCHEME DocPartScheme AS
PARTITION DocPartFunction TO (Data_FG1, Data_FG2, Data_FG3);
GO
CREATE PARTITION SCHEME DocFSPartScheme AS
PARTITION DocPartFunction TO (FS_FG1, FS_FG2, FS_FG3);
GO
CREATE TABLE DocumentStore (
23
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID () ON Data_FG1)
ON DocPartScheme (DocumentID)
FILESTREAM_ON DocFSPartScheme;
GO
Observe que para usar la columna DocumentID como columna de partición, el índice no clúster
subyacente que aplica la restricción UNIQUE en el DocGUID se debe colocar explícitamente en un grupo
de archivos para que la columna DocumentID puede ser la columna de partición. Esto significa que el
cambio de partición solo es posible si se deshabilitan las restricciones UNIQUE antes de realizar el
cambio de partición, ya que son índices no alineados y, a continuación, se vuelven a habilitar.
Continuando con el ejemplo anterior, en el código siguiente se crea una tabla y después se intenta un
cambio de partición.
CREATE TABLE NonPartitionedDocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID ());
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
Se produce un error en el cambio de partición y se genera el mensaje siguiente.
Mensaje 7733, nivel 16, estado 4, línea 1
Error de la instrucción 'ALTER TABLE SWITCH'. La tabla
'FileStreamTestDB.dbo.DocumentStore' tiene particiones, mientras que el índice
'UQ_Document_8CC1617F60ED59' no las tiene.
24
Al deshabilitar el índice único en la tabla de origen e intentarlo de nuevo se obtiene el código siguiente.
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON DocumentStore DISABLE;
GO
ALTER TABLE FileStreamTest3 SWITCH PARTITION 2 TO NonPartitionedFileStreamTest3;
GO
Esto también produce un error y se muestra el mensaje siguiente.
Mensaje 4947, Nivel 16, Estado 1, Línea 1
Error de la instrucción ALTER TABLE SWITCH. El índice de la tabla de origen
'FileStreamTestDB.dbo.DocumentStore' no es idéntico al índice
'UQ_NonParti_8CC3316103317E3D' de la tabla de destino
'FileStreamTestDB.dbo.NonPartitionedDocumentStore'.
Se deben deshabilitar los índices únicos de las tablas con particiones y sin particiones antes de que el
modificador pueda continuar.
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON NonPartitionedDocumentStore DISABLE;
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
GO
25
Se incluirá más información sobre la creación de particiones de datos de FILESTREAM en unas notas
del producto futuras sobre la creación de particiones en SQL Server 2008.
Equilibrio de carga de datos de FILESTREAM
También se puede usar la creación de particiones para crear un esquema de tabla que permita el
equilibrio de carga de los datos de FILESTREAM entre varios volúmenes. Puede resultar conveniente
por diversas razones como limitaciones del hardware o para permitir el almacenamiento de zonas activas
de una tabla en volúmenes diferentes.
En el código siguiente se muestra una función y un esquema de partición según la columna
uniqueidentifier que reparte eficazmente los datos de FILESTREAM en 16 volúmenes y crea bandas de
los datos estructurados en dos grupos de archivos.
USE master;
GO
-- Crear la base de datos
CREATE DATABASE Production ON PRIMARY
(NAME = 'Production', FILENAME = 'E:\Production\Production.mdf'),
FILEGROUP DataFilegroup1
(NAME = 'Data_FG1', FILENAME = 'F:\Production\Data_FG1.ndf'),
FILEGROUP DataFilegroup2
(NAME = 'Data_FG2', FILENAME = 'G:\Production\Data_FG2.ndf'),
FILEGROUP FSFilegroup0 CONTAINS FILESTREAM
(NAME = 'FS_FG0', FILENAME = 'H:\Production\FS_FG0'),
FILEGROUP FSFilegroup1 CONTAINS FILESTREAM
(NAME = 'FS_FG1', FILENAME = 'I:\Production\FS_FG1'),
FILEGROUP FSFilegroup2 CONTAINS FILESTREAM
(NAME = 'FS_FG2', FILENAME = 'J:\Production\FS_FG2'),
FILEGROUP FSFilegroup3 CONTAINS FILESTREAM
(NAME = 'FS_FG3', FILENAME = 'K:\Production\FS_FG3'),
FILEGROUP FSFilegroup4 CONTAINS FILESTREAM
(NAME = 'FS_FG4', FILENAME = 'L:\Production\FS_FG4'),
26
FILEGROUP FSFilegroup5 CONTAINS FILESTREAM
(NAME = 'FS_FG5', FILENAME = 'M:\Production\FS_FG5'),
FILEGROUP FSFilegroup6 CONTAINS FILESTREAM
(NAME = 'FS_FG6', FILENAME = 'N:\Production\FS_FG6'),
FILEGROUP FSFilegroup7 CONTAINS FILESTREAM
(NAME = 'FS_FG7', FILENAME = 'O:\Production\FS_FG7'),
FILEGROUP FSFilegroup8 CONTAINS FILESTREAM
(NAME = 'FS_FG8', FILENAME = 'P:\Production\FS_FG8'),
FILEGROUP FSFilegroup9 CONTAINS FILESTREAM
(NAME = 'FS_FG9', FILENAME = 'Q:\Production\FS_FG9'),
FILEGROUP FSFilegroupA CONTAINS FILESTREAM
(NAME = 'FS_FGA', FILENAME = 'R:\Production\FS_FGA'),
FILEGROUP FSFilegroupB CONTAINS FILESTREAM
(NAME = 'FS_FGB', FILENAME = 'S:\Production\FS_FGB'),
FILEGROUP FSFilegroupC CONTAINS FILESTREAM
(NAME = 'FS_FGC', FILENAME = 'T:\Production\FS_FGC'),
FILEGROUP FSFilegroupD CONTAINS FILESTREAM
(NAME = 'FS_FGD', FILENAME = 'U:\Production\FS_FGD'),
FILEGROUP FSFilegroupE CONTAINS FILESTREAM
(NAME = 'FS_FGE', FILENAME = 'V:\Production\FS_FGE'),
FILEGROUP FSFilegroupF CONTAINS FILESTREAM
(NAME = 'FS_FGF', FILENAME = 'W:\Production\FS_FGF');
GO
USE Production;
GO
-- Crear una función de partición basada en los 6 últimos bytes del GUID
27
CREATE PARTITION FUNCTION LoadBalance_PF (UNIQUEIDENTIFIER)
AS RANGE LEFT FOR VALUES (
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-100000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-200000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-300000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-400000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-500000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-600000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-700000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-800000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-900000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-a00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-b00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-c00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-d00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-e00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-f00000000000'));
GO
-- Crear un esquema de partición de FILESTREAM que permita la asignación a 16 grupos
de archivos de FILESTREAM
CREATE PARTITION SCHEME LoadBalance_FS_PS
AS PARTITION LoadBalance_PF TO (
FSFileGroup0, FSFileGroup1, FSFileGroup2, FSFileGroup3,
FSFileGroup4, FSFileGroup5, FSFileGroup6, FSFileGroup7,
FSFileGroup8, FSFileGroup9, FSFileGroupA, FSFileGroupB,
FSFileGroupC, FSFileGroupD, FSFileGroupE, FSFileGroupF);
GO
28
-- Crear un esquema de partición de datos para aplicar la técnica round-robin entre
dos grupos de archivos
CREATE PARTITION SCHEME LoadBalance_Data_PS
AS PARTITION LoadBalance_PF TO (
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2);
GO
-- Crear la tabla con particiones
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
DEFAULT NEWID (),
CONSTRAINT DocStorePK PRIMARY KEY CLUSTERED (DocGUID),
CONSTRAINT DocStoreU UNIQUE (DocGUID))
ON LoadBalance_Data_PS (DocGUID)
FILESTREAM_ON LoadBalance_FS_PS;
GO
El equilibrio de carga se puede probar fácilmente mediante el código siguiente.
SET NOCOUNT ON;
GO
29
-- Insertar 10000 filas para probar el equilibrio de carga
DECLARE @count INT = 0;
WHILE (@count < 10000)
BEGIN
INSERT INTO DocumentStore DEFAULT VALUES;
SET @count = @count + 1;
END;
GO
-- Comprobar la distribución
SELECT COUNT ($PARTITION.LoadBalance_PF (DocGUID))
FROM DocumentStore
GROUP BY $PARTITION.LoadBalance_PF (DocGUID);
GO
Los resultados de una ejecución de ejemplo de esta prueba fueron de 631, 641, 661, 640, 649, 637, 618,
618, 576, 608, 595, 645, 640, 616, 602 y 623 filas en cada uno de los grupos de archivos de
FILESTREAM FS_FG0 a FS_FGF.
Combinaciones de características y restricciones
Puesto que la característica FILESTREAM almacena datos dentro del sistema de archivos, hay algunas
restricciones y consideraciones sobre la combinación de FILESTREAM con otras características de SQL
Server. Esta sección proporciona información general sobre las combinaciones de características que
debe conocer. Para obtener más información, vea el tema "Compatibilidad de FILESTREAM con otras
características de SQL Server" (http://msdn.microsoft.com/es-es/library/bb895334.aspx) en los Libros en
pantalla de SQL Server 2008.
Replicación
Tanto la replicación transaccional como la replicación de mezcla admiten datos de FILESTREAM, pero
hay que tener en cuenta muchos aspectos como los siguientes:


30
Cuando la topología de replicación incluye instancias que usan versiones diferentes de SQL
Server, existen limitaciones en cuanto al tamaño de los datos que se pueden enviar a instancias
de nivel inferior.
Las opciones de filtro de replicación determinan si el atributo FILESTREAM se replica o no
mediante replicación transaccional.


El tamaño del valor máximo de datos varbinary(max) que se puede replicar en la replicación
transaccional sin replicar el atributo FILESTREAM es 2 GB.
Cuando se usa la replicación de mezcla, tanto ella como FILESTREAM necesitan una columna
uniqueidentifier. Hay que tener cuidado con el esquema de la tabla cuando se usa la replicación
de mezcla para que los GUID sean secuenciales (es decir, use NEWSEQUENTIALID() en lugar
de NEWID()).
Creación de reflejo de la base de datos
La creación de reflejo de la base de datos no admite FILESTREAM. No se puede crear un grupo de
archivos FILESTREAM en el servidor principal. La creación de reflejo de la base de datos no se puede
configurar para una base de datos que contiene grupos de archivos de FILESTREAM.
Cifrado
Los datos de FILESTREAM no se pueden cifrar mediante los métodos de cifrado de SQL Server. Si el
cifrado de datos transparente está habilitado, los datos de FILESTREAM no se cifran.
Clústeres de conmutación por error
FILESTREAM se admite totalmente con clústeres de conmutación por error. Todos los nodos del clúster
deben tener habilitado FILESTREAM en el nivel de Windows y los contenedores de datos de FILESTREAM
se deben colocar en almacenamiento compartido para que los datos estén disponibles en todos los nodos.
Para obtener más información, vea en los Libros en pantalla de SQL Server 2008 el tema: "Configurar
FILESTREAM en un clúster de conmutación por error" (http://msdn.microsoft.com/es-es/library/cc645886.aspx).
Texto completo
La indización de texto completo funciona con una columna FILESTREAM exactamente igual que con una
columna varbinary(max). La tabla debe tener una columna adicional que contenga la extensión de
nombre de archivo para los datos BLOB que se almacenan en la columna FILESTREAM.
Instantáneas de base de datos
SQL Server no admite instantáneas de base de datos para los contenedores de datos de FILESTREAM.
Si se incluye un archivo de datos de FILESTREAM en una cláusula CREATE DATABASE ON, se
producirá un error en la instrucción y se generará el mensaje correspondiente.
Si una base de datos contiene datos de FILESTREAM, todavía se puede crear una instantánea de base
de datos de los grupos de archivos normales. En este caso, se devolverá un mensaje de advertencia
y los grupos de archivos de FILESTREAM se marcarán como sin conexión en la instantánea de base de
datos. Las consultas funcionarán de la manera esperada en la instantánea de base de datos a menos
que intenten obtener acceso a los datos de FILESTREAM. Si esto ocurre, se producirá un error.
Una base de datos que contiene datos FILESTREAM no se puede revertir a una instantánea, ya que no
hay ninguna manera de saber en qué estado estaban los datos de FILESTREAM en el momento
representado por la instantánea de base de datos.
Vistas, índices, estadísticas, desencadenadores y restricciones
Las columnas FILESTREAM no pueden formar parte de una clave de índice ni especificarse como una
columna INCLUDE en un índice no clúster. Es posible definir una columna calculada que haga referencia
a una columna FILESTREAM, pero la columna calculada no se puede indizar.
31
No se pueden crear estadísticas de columnas FILESTREAM.
No se pueden crear restricciones PRIMARY KEY, FOREIGN KEY y UNIQUE en columnas
FILESTREAM.
Las vistas indizadas no pueden contener columnas FILESTREAM; sin embargo, las vistas no indizadas
sí pueden contenerlas.
No se pueden definir desencadenadores INSTEAD OF en tablas que contienen columnas FILESTREAM.
Niveles de aislamiento
Cuando se obtiene acceso a datos de FILESTREAM mediante las API de Win32, solo se admite el nivel
de aislamiento de lectura confirmada. El acceso a Transact-SQL también permite los niveles de
aislamiento de lectura repetible y serializable. Además, mediante el acceso a Transact-SQL, se permiten
lecturas de datos sucios en el nivel de aislamiento de lectura no confirmada, o la sugerencia de consulta
NOLOCK, pero dicho acceso no mostrará las actualizaciones en curso de datos de FILESTREAM.
Copias de seguridad y restauración
FILESTREAM funciona con todos los modelos de recuperación y todas las formas de copias de
seguridad y restauración (completa, diferencial y de registros). En una situación de desastre, si se
especifica la opción CONTINUE_AFTER_ERROR en una opción BACKUP o RESTORE, los datos de
FILESTREAM pueden no recuperarse sin pérdida de datos (similar a la recuperación de datos normales
cuando se especifica CONTINUE_AFTER_ERROR).
Seguridad
La instancia de SQL Server debe estar configurada para usar seguridad integrada si se necesita el
acceso de Win32 a los datos de FILESTREAM.
Trasvase de registros
El trasvase de registros admite FILESTREAM. Los servidores principal y secundario deben ejecutar SQL
Server 2008, o una versión posterior, y deben tener habilitado FILESTREAM en el nivel de Windows.
SQL Server Express
SQL Server Express admite FILESTREAM. El límite de tamaño de base de datos de 4 GB no incluye el
contenedor de datos de FILESTREAM.
Sin embargo, si se envían datos de FILESTREAM hacia o desde la instancia de SQL Server Express
mediante Service Broker, hay que tener cuidado porque Service Broker no admite el almacenamiento de
datos como FILESTREAM en las colas de transmisión ni de destino. Esto significa que si se forma una
cola, se puede alcanzar el límite de tamaño de base de datos de 4 GB.
En este caso, una alternativa consiste en usar un esquema donde la conversación de Service Broker
envíe las notificaciones que los datos de FILESTREAM deben enviar o recibir. A continuación, la transmisión
real de los datos de FILESTREAM se realiza mediante acceso remoto a través del recurso compartido de
FILESTREAM del contenedor de datos de FILESTREAM de la instancia de SQL Server Express.
32
Consideraciones sobre la optimización del rendimiento y las simulaciones
Hay varias consideraciones importantes a la hora de optimizar una carga de trabajo de FILESTREAM:






Asegúrese de que el hardware esté configurado correctamente para FILESTREAM.
Asegúrese de que la generación de nombres 8.3 esté deshabilitada en NTFS.
Asegúrese de que el seguimiento de la última hora de acceso esté deshabilitado en NTFS.
Asegúrese de que el contenedor de datos de FILESTREAM no se encuentre en un volumen
fragmentado.
Asegúrese de que el tamaño de datos BLOB sea adecuado para el almacenamiento con
FILESTREAM.
Asegúrese de que los contenedores de datos de FILESTREAM tengan sus propios volúmenes
dedicados.
Un factor importante que hay que destacar es el tamaño de búfer usado por el protocolo SMB que se
emplea para almacenar en búfer las lecturas de datos de FILESTREAM. En las pruebas con el sistema
operativo Windows Server® 2003, los tamaños de búfer mayores suelen lograr un mejor rendimiento,
con tamaños de búfer de un múltiplo de aproximadamente 60 kB. Los tamaños de búfer mayores pueden
ser más eficientes en otros sistemas operativos.
Hay otras consideraciones adicionales cuando se compara una carga de trabajo de FILESTREAM con
otras opciones de almacenamiento (una vez optimizada la carga de trabajo de FILESTREAM):



Asegúrese de que el hardware de almacenamiento y el nivel RAID sean los mismos en ambos casos.
Asegúrese de que la configuración de compresión del volumen sea la misma en ambos casos.
Tenga en cuenta si FILESTREAM va a realizar escritura continua según la API en uso y las
opciones especificadas.
Consideraciones sobre la migración de datos
Un escenario habitual con SQL Server 2008 será la migración de datos BLOB existentes al
almacenamiento de FILESTREAM. Si bien proporcionar una herramienta completa o un conjunto de
código para realizar esas migraciones queda fuera del ámbito de estas notas del producto, a
continuación se muestra un flujo de trabajo simple que se puede seguir:






33
Revisar las consideraciones de tamaño de datos para usar FILESTREAM con el fin de
asegurarse de que los tamaños de datos promedio implicados son tales que el almacenamiento
de FILESTREAM resulta adecuado.
Revisar la información disponible sobre las combinaciones de características y las limitaciones
para asegurarse de que el almacenamiento de FILESTREAM funcionará con todos los demás
requisitos de la aplicación.
Seguir las recomendaciones de la sección "Consideraciones sobre la optimización del
rendimiento y las simulaciones" anterior.
Asegurarse de que la instancia de SQL Server usa seguridad integrada y que FILESTREAM se
ha habilitado en los niveles de Windows y SQL Server.
Asegurarse de que la ubicación del contenedor de datos de FILESTREAM de destino tiene
suficiente espacio en disco para almacenar los datos BLOB migrados.
Crear los grupos de archivos de FILESTREAM necesarios.



Duplicar los esquemas de tabla implicados, cambiando las columnas BLOB necesarias para que
sean FILESTREAM.
Migrar al nuevo esquema todos los datos que no sean BLOB.
Migrar todos los datos BLOB a las nuevas columnas FILESTREAM.
Prácticas recomendadas para el uso de FILESTREAM
Esta sección es una colección de prácticas recomendadas que han surgido del uso de FILESTREAM
durante las pruebas internas y públicas de la versión preliminar de la característica. Como ocurre con
todas las prácticas recomendadas, se trata de generalizaciones y quizás no sean aplicables a todas las
situaciones y todos los escenarios. Las prácticas recomendadas son las siguientes, sin ningún orden
concreto:




Se deben evitar varias anexiones pequeñas un archivo de FILESTREAM siempre que sea
posible, ya que cada anexión crea un archivo de FILESTREAM nuevo. Esto puede ser muy
costoso en el caso de archivos de FILESTREAM grandes. Si es posible, se deben agrupar varias
anexiones en una sola columna varbinary(max) y después anexarlas a la columna
FILESTREAM cuando se alcance un umbral de tamaño.
En el caso de una carga de trabajo con muchas escrituras multiproceso, considere la posibilidad
de configurar el parámetro AllocationSize para las API OpenSqlFilestream o SqlFilestream. Unos
tamaños de asignación iniciales mayores limitarán la posibilidad de fragmentación en el nivel del
sistema de archivos, especialmente cuando se combinan con un tamaño de clúster NTFS grande
como se ha descrito anteriormente.
Si los archivos de FILESTREAM son grandes, evite actualizaciones de Transact-SQL que
anexen o antepongan datos a un archivo. Esto (normalmente) pondrá en cola datos en tempdb
y de nuevo en un nuevo archivo físico, lo que afectará al rendimiento.
Cuando se lea un valor de FILESTREAM, tenga en cuenta lo siguiente:
o Si las lecturas solo necesitan leer los primeros bytes, use la funcionalidad de subcadena.
o Si se va a leer todo el archivo, use el acceso de Win32.
o Si se van a leer partes aleatorias del archivo, abra el identificador de archivo mediante
SetFilePointer.
o Cuando se lea un archivo completo, especifique la marca FILE_SEQUENTIAL_ONLY.
o Use búferes cuyo tamaño sea múltiplos de 60 kB (como se ha descrito anteriormente).
El tamaño de un archivo de FILESTREAM se puede obtener sin necesidad de abrir un identificador para
el archivo: agregue una columna calculada persistente a la tabla que almacena el tamaño de archivo de
FILESTREAM. La columna calculada se actualiza mientras el archivo ya está abierto para operaciones
de escritura.
Conclusión
En estas notas del producto se ha descrito la característica FILESTREAM de SQL Server 2008
que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinación
de SQL Server 2008 y el sistema de archivos NTFS. Para concluir, merece la pena reiterar los
puntos principales destacados en este documento.
34
El almacenamiento de FILESTREAM no resulta adecuado en todos los casos. Según estudios
anteriores y el comportamiento de la característica FILESTREAM, es mejor almacenar como
datos FILESTREAM los datos BLOB con un tamaño de 1 MB o más a los que no se va
a obtener acceso mediante Transact-SQL.
También hay que tener en cuenta la carga de trabajo de actualización, ya que cualquier
actualización parcial de un archivo de FILESTREAM generará una copia completa del archivo.
Con una carga de trabajo en la que haya muchas actualizaciones, el rendimiento puede
disminuir tanto que FILESTREAM no resulte adecuado.
Se deben estudiar los detalles de las combinaciones de características para asegurarse de que
la implementación se realiza correctamente. Por ejemplo, en SQL Server 2008 RTM, la creación
de reflejo de la base de datos no puede usar datos de FILESTREAM ni aislamiento de instantánea.
Se admiten la mayoría de las demás combinaciones de características, pero algunas pueden
tener ciertas limitaciones (como la replicación). Estas notas del producto no proporcionan una
taxonomía exhaustiva de las características y su interacción, por lo que se deben consultar las
secciones más recientes de los Libros en pantalla de SQL Server antes de la implementación,
especialmente porque es posible que algunas limitaciones aumenten en futuras versiones.
Por último, si FILESTREAM se implementa sin configurar correctamente Windows y SQL Server,
quizás no se alcancen los niveles de rendimiento previstos. Se deben usar las prácticas
recomendadas y los detalles de configuración descritos anteriormente como ayuda para evitar
problemas de rendimiento.
Para obtener más información:
http://www.microsoft.com/sqlserver/: Sitio web de SQL Server
http://technet.microsoft.com/es-es/sqlserver/: SQL Server TechCenter
http://msdn.microsoft.com/es-es/sqlserver/: Centro para desarrolladores de SQL Server
¿Le sirvió de ayuda este documento? Proporciónenos su opinión. Díganos, en una escala de
1 (poco útil) a 5 (excelente), cómo calificaría este documento y por qué lo valora con esta
puntuación. Por ejemplo:


¿Lo valora alto debido a que tiene buenos ejemplos, capturas de pantalla excelentes,
una redacción comprensible u otra razón?
¿Lo valora bajo debido a que sus ejemplos son escasos, las capturas de pantalla son
borrosas o su redacción es poco clara?
Esta información nos ayudará a mejorar la calidad de las notas del producto que publicamos.
Enviar comentarios.
35
Descargar