You are on page 1of 35

Artculo tcnico de SQL Server

Autor: Paul S. Randal (SQLskills.com)


Revisores tcnicos: Alexandru Chirica, Arkadi Brjazovski, Prem Mehra, Joanna Omel,
Mike Ruthruff, Robin Dhamankar

Fecha de publicacin: octubre de 2008
Se aplica a: SQL Server 2008

Resumen: en estas notas del producto se describe la caracterstica FILESTREAM de SQL
Server 2008, que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una
combinacin de SQL Server 2008 y el sistema de archivos NTFS. Tambin se explican las
distintas opciones de almacenamiento de BLOB, la configuracin 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 caractersticas, y detalles de implementacin como la
creacin de particiones y el rendimiento.
Estas notas del producto estn destinadas a arquitectos, profesionales de TI y DBA encargados
de la evaluacin o implementacin 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.
Introduccin
En la sociedad actual se generan datos a unas velocidades increbles y a menudo es necesario
almacenarlos y obtener acceso a ellos de manera controlada y eficiente. Existen distintas tecnologas
para ello y la eleccin de la tecnologa 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 fcilmente 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 informacin para los productos que la compaa vende, otra
tabla con informacin sobre los clientes y otra tabla con los detalles de ventas de los productos
a los clientes. El acceso a los datos y su manipulacin se realiza mediante un lenguaje de consultas
enriquecido como Transact-SQL.

2

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 ningn 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 ningn esquema pero en realidad tienen un esquema muy
simple inherente, como los archivos de imagen, vdeo de transmisin 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 comnmente
como objetos binarios grandes, o simplemente blobs.
En estas notas del producto se describe la caracterstica FILESTREAM de SQL Server 2008, que permite
el almacenamiento y el acceso eficiente a datos BLOB mediante una combinacin de SQL Server 2008
y el sistema de archivos NTFS. Se explica la caracterstica FILESTREAM propiamente dicha, las opciones
de almacenamiento de BLOB, la configuracin 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 caractersticas, y detalles de implementacin como las particiones y el rendimiento.
Opciones para el almacenamiento de blobs
Si bien los datos estructurados y semiestructurados se pueden almacenar fcilmente en una base de
datos relacional, la eleccin de dnde almacenar los datos no estructurados o BLOB es ms complicada.
A la hora de decidir dnde almacenar los datos BLOB, tenga en cuenta los siguientes requisitos:
Rendimiento: la manera en que se van a usar los datos es un factor fundamental. Si se necesita
acceso de transmisin por secuencias, el almacenamiento de los datos dentro de una base de
datos de SQL Server puede ser ms lento que almacenarlos externamente en una ubicacin
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 aplicacin cliente (directamente o con un almacenamiento
en bfer 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 bferes) y despus se devuelven
a la aplicacin cliente a travs de una conexin de cliente. Esto no solo significa que los datos
pasan por una fase de procesamiento adicional; tambin 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 mtodos de seguridad como las listas de control de acceso (ACL).
Tamao de los datos: segn el estudio que se cita ms 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 ms de 1 megabyte (MB) fuera de la base de datos. En el caso de
datos cuyo tamao est comprendido entre 256 kB y 1 MB, la solucin de almacenamiento ms
eficiente depende de la proporcin 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.

3

Acceso de cliente: el protocolo que el cliente emplea para obtener acceso a datos de SQL
Server, como ODBC, quizs no sea el adecuado para aplicaciones como la transmisin por
secuencias de archivos de vdeo grandes. En este caso, puede ser necesario almacenar los
datos en el sistema de archivos.
Semntica transaccional: si los datos BLOB tienen asociados datos estructurados que se
almacenarn en la base de datos, los cambios en los datos BLOB necesitarn ajustarse a la
semntica transaccional para que los dos conjuntos de datos estn sincronizados. Por ejemplo,
si una transaccin crea datos BLOB y una fila en una tabla de base de datos pero despus hace
una reversin, se debe revertir la creacin de los datos BLOB y la creacin de la fila de la tabla.
Esto puede resultar muy complejo si los datos BLOB se almacenan en el sistema de archivos sin
ningn vnculo a la base de datos.
Fragmentacin de datos: las actualizaciones y sobrescrituras frecuentes harn 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 funcin de dnde 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
ms fcil resolver esta fragmentacin si se usa el sistema de archivos en lugar de SQL Server.
Facilidad de uso: es ms difcil y costoso administrar una solucin que emplea varias tecnologas
no integradas que una solucin integrada.
Costo: el costo de la solucin de almacenamiento vara en funcin de la tecnologa que se emplea.
Las explicaciones anteriores sobre el tamao y la fragmentacin 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 ms informacin 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, segn 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
comparacin
Solucin de almacenamiento
Servidor de
archivos/sistema
de archivos
SQL Server
(con varbinary (max))
FILESTREAM
Tamao mximo
de BLOB
Tamao del volumen
NTFS
2 GB - 1 bytes Tamao del volumen
NTFS
Rendimiento de la
transmisin por
secuencias de BLOB
grandes
Excelente Deficiente Excelente
Seguridad ACL manuales Integrada Integrada + ACL
automticas
Costo por GB Bajo Alto Bajo
Facilidad de uso Difcil Integrada Integrada
Integracin con
datos estructurados
Difcil Coherencia en el nivel
de datos
Coherencia en el nivel
de datos
Desarrollo
e implementacin
de aplicaciones
Ms complejos Ms sencillos Ms sencillos

4


Punto de
comparacin
Solucin de almacenamiento
Servidor de
archivos/sistema
de archivos
SQL Server
(con varbinary (max))
FILESTREAM
Recuperacin
de la fragmentacin
de datos
Excelente Deficiente Excelente
Rendimiento de
pequeas
actualizaciones
frecuentes
Excelente Moderado Deficiente
Tabla 1: comparacin de las tecnologas de almacenamiento de BLOB anteriores a SQL Server 2008
FILESTREAM es la nica solucin que proporciona coherencia transaccional de los datos estructurados
y no estructurados, as como administracin integrada, seguridad, bajo costo y excelente rendimiento de
transmisin 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 seccin "Informacin general de
FILESTREAM" ms adelante en estas notas del producto se proporcionan ms detalles sobre la
arquitectura de FILESTREAM.
Informacin general de FILESTREAM
FILESTREAM es una caracterstica 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 transmisin por secuencias de Win32 de alto rendimiento, lo que evita la penalizacin de
rendimiento que supone el acceso a los datos BLOB a travs de SQL Server.
FILESTREAM mantiene en todo momento la coherencia transaccional entre los datos estructurados y no
estructurados, e incluso permite la recuperacin a un momento dado de los datos de FILESTREAM
mediante copias de seguridad de registros. SQL Server mantiene automticamente la coherencia y no se
necesita ninguna lgica personalizada en la aplicacin. Para ello, el mecanismo de FILESTREAM
mantiene el equivalente de un registro de transacciones de la base de datos, que comparte muchos
requisitos de administracin (se describen con ms detalle en la seccin "Configurar la recoleccin de
elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto). La combinacin
del registro de transacciones de la base de datos y el registro de transacciones de FILESTREAM permite
la correcta recuperacin 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 mayora de las funciones y herramientas de administracin de SQL Server funcionan para los datos de
FILESTREAM sin necesidad de realizar modificacin alguna.
Hay que destacar que el comportamiento del tipo de datos varbinary (max) normal no ha cambiado en
SQL Server 2008, incluido el lmite de tamao de 2 GB. La incorporacin del atributo FILESTREAM hace
que una columna varbinary (max) tenga bsicamente un tamao ilimitado (en realidad, el tamao est
limitado al del volumen NTFS subyacente).

5

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 habilitacin de FILESTREAM
en el nivel de Windows. El uso de un controlador del filtro del sistema de archivos tambin permite el
acceso remoto a los datos de FILESTREAM a travs de una ruta de acceso UNC. SQL Server mantiene
un vnculo de ordenaciones de filas de tabla a los archivos FILESTREAM asociados. Esto significa que si
se elimina o se cambia el nombre de algn archivo de FILESTREAM directamente a travs del sistema
de archivos se daar 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 tambin algunas restricciones
cuando se combina con otras caractersticas (como la imposibilidad de cifrar datos de FILESTREAM).
Todo esto se describe con detalle en la seccin "Configurar SQL Server para FILESTREAM", ms
adelante en estas notas del producto.
Hay dos formas de obtener acceso a datos de FILESTREAM y manipularlos: con el modelo de
programacin Transact-SQL estndar o mediante las API de transmisin por secuencias de Win32.
Ambos mecanismos reconocen totalmente las transacciones y admiten la mayora de las operaciones
DML, incluidas la insercin, actualizacin, eliminacin y seleccin. Tambin se admiten datos de
FILESTREAM para operaciones de mantenimiento como copia de seguridad, restauracin y comprobacin
de coherencia. La principal excepcin es que no se admiten actualizaciones parciales de los datos de
FILESTREAM. Cualquier actualizacin de un valor de datos de FILESTREAM se traduce en la creacin
de una nueva copia del archivo de datos de FILESTREAM. El archivo anterior se quita de forma
asincrnica, como se describe en la seccin "Configurar la recoleccin de elementos no utilizados de
FILESTREAM", ms adelante en estas notas del producto.
Acceso a datos BLOB mediante el modelo de programacin dual
Despus de almacenar los datos en una columna FILESTREAM, se puede obtener acceso a ellos
mediante transacciones Transact-SQL o a travs de las API de Win32. Esta seccin ofrece algunos
detalles generales sobre los modelos de programacin y su uso.
Acceso a Transact-SQL
Con Transact-SQL, es posible insertar, actualizar y eliminar datos de FILESTREAM de la manera siguiente:
Se pueden rellenar previamente campos de FILESTREAM mediante una operacin de insercin
(con un valor vaco o un valor pequeo distinto de NULL). Sin embargo, las interfaces de Win32
constituyen una manera ms 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, tambin se eliminan los datos BLOB subyacentes
del sistema de archivos. La eliminacin fsica real de los archivos de FILESTREAM es un
proceso asincrnico en segundo plano, como se explica en la seccin "Configurar la recoleccin
de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto.

6

Para obtener ms informacin 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 transmisin por secuencias de Win32
Para permitir el acceso transaccional del sistema de archivos a los datos de FILESTREAM, una nueva
funcin intrnseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), proporciona el token que representa
la transaccin actual a la que est asociada la sesin. Se debe haber iniciado la transaccin y no haberse
confirmado ni revertido todava. Al obtener un token, la aplicacin enlaza las operaciones de transmisin
por secuencias del sistema de archivos de FILESTREAM con una transaccin iniciada. La funcin devuelve
NULL en caso de que se no haya iniciado explcitamente ninguna transaccin. 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
fsico de BLOB. Una nueva funcin intrnseca, PathName, proporciona la ruta de acceso UNC lgica del
BLOB correspondiente a cada campo de FILESTREAM de la tabla. La aplicacin usa esta ruta de acceso
lgica para obtener el identificador de Win32 y actuar sobre los datos BLOB mediante las interfaces
normales del sistema de archivos de Win32. La funcin 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 transmisin por secuencias de Win32 funciona en el contexto de una transaccin
de SQL Server. Despus de obtener un token de transaccin 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. Despus, las interfaces de transmisin 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 ms, 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 vnculo entre la base de datos y el sistema
de archivos (es decir,
la base de datos resultar daada).
El acceso del sistema de archivos de FILESTREAM modela una instruccin Transact-SQL mediante la
apertura y el cierre de archivos. La instruccin 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 estn registrados en la tabla como
si se hubiera completado una instruccin UPDATE.
Para obtener ms informacin 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.

7

Semntica de transacciones
Se deben cerrar todos los identificadores de archivo antes de que la transaccin se confirme o se
revierta. Si se queda abierto un identificador cuando se confirma una transaccin, se produce un error en
la confirmacin y todas las lecturas y escrituras adicionales del identificador provocan un error, como
cabra esperar. Entonces se debe revertir la transaccin. 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 operacin 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 asincrnica, como se describe en la seccin "Configurar la
recoleccin de elementos no utilizados de FILESTREAM", ms adelante en estas notas del producto.
Con FILESTREAM, el motor de base de datos asegura la durabilidad de la transaccin en la confirmacin
de los datos BLOB de FILESTREAM que se modifican desde el acceso de transmisin por secuencias
del sistema de archivos. Para ello se emplea el registro de FILESTREAM mencionado anteriormente
y un vaciado explcito del contenido del archivo de FILESTREAM en el disco.
Semntica de aislamiento
La semntica de aislamiento se rige por los niveles de aislamiento de transaccin 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 tambin permite los niveles de
aislamiento de lectura repetible y serializable. Adems, 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 ningn 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 transaccin. Se produce un error en las llamadas de API de transmisin por
secuencias con ERROR_SHARING_VIOLATION si la operacin de apertura no puede continuar debido
a la infraccin de aislamiento.
Actualizaciones parciales
Para permitir que se realicen actualizaciones parciales, la aplicacin 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. Tambin 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
aplicacin y evitar posibles tiempos de espera mientras trabaja con archivos muy grandes, debe usar E/S
asincrnica.
Si se emite el FSCTL una vez que se ha escrito en el identificador, se conservar la ltima operacin de
escritura y se perdern las escrituras anteriores realizadas en el identificador.
Para obtener ms informacin 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.

8

Escritura continua desde clientes remotos
El acceso remoto del sistema de archivos a datos de FILESTREAM est habilitado a travs 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 cdigo nativo es realizar una escritura continua, mientras que en las API
administradas el valor predeterminado es usar el almacenamiento en bfer. 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 pequeas
operaciones de escritura (mediante almacenamiento en bfer) para realizar menos operaciones de
escritura con un tamao de datos mayor. Adems, si se emplea el almacenamiento en bfer, el cliente
debe emitir un vaciado explcito antes de que se confirme la transaccin.
No se admite la creacin de vistas asignadas a la memoria (E/S asignada a la memoria) usando un identificador
FILESTREAM. Si se usa la asignacin 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.
Cundo se debe usar FILESTREAM
Aunque la tecnologa FILESTREAM cuenta con muchas caractersticas atractivas, quizs no sea la
opcin ptima en todas las situaciones. Como se ha mencionado anteriormente, el tamao de los datos
BLOB y los patrones de acceso son los factores ms importantes a la hora de decidir si los datos BLOB
se deben almacenar totalmente dentro de la base de datos o mediante FILESTREAM.
El tamao afecta a lo siguiente:
Eficiencia del acceso a los datos BLOB mediante cualquier mecanismo de almacenamiento.
Como se ha mencionado anteriormente, el acceso de transmisin por secuencias a datos BLOB
grandes es ms eficiente con FILESTREAM, pero las actualizaciones parciales son
(potencialmente mucho) ms 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 nmero de archivos de FILESTREAM ser ms lenta
que una copia de seguridad exclusivamente de archivos de base de datos de SQL Server de un
tamao 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 ms 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 grfico siguiente muestra el rendimiento relativo de lecturas locales de diferentes
tamaos de datos de BLOB mediante varbinary(max), FILESTREAM mediante Transact-SQL
y FILESTREAM mediante NTFS. Se puede ver (en la lnea azul) que el acceso Win32 de los datos de
FILESTREAM es varias veces ms rpido que el acceso a Transact-SQL de datos varbinary(max)
a medida que el tamao de los datos aumenta. Tenga en cuenta que las medidas de rendimiento estn
en megabits por segundo (Mbps).

9


Ilustracin 1: rendimiento de lectura de diferentes tamaos de BLOB
Las cifras de NTFS incluyen el tiempo necesario para iniciar una transaccin, recuperar el nombre de la
ruta de acceso y el contexto de la transaccin 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 ncleos de
procesador y un grupo de bferes 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 transmisin por secuencias de Win32 y el acceso normal
a SQL Server. Si no se puede, FILESTREAM no resultar adecuado, ya que el mximo rendimiento se
obtiene cuando se usan las API de transmisin por secuencias de Win32.
Configurar Windows para FILESTREAM
Como ocurre con cualquier otra implementacin, antes de implementar una aplicacin 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 seccin se explica cmo
configurar el hardware de almacenamiento y el sistema de archivos NTFS como preparacin para el uso
de FILESTREAM. Despus se muestra cmo habilitar FILESTREAM en el nivel de Windows.
Seleccin y configuracin de hardware
Una de las causas ms frecuentes de una carga de trabajo con un rendimiento bajo es una configuracin
de hardware inadecuada. A veces la causa es una memoria insuficiente, lo que conduce a "paginar
excesivamente" el grupo de bferes 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 usarn FILESTREAM para la transmisin por secuencias de
alto rendimiento de datos BLOB mediante las API de Win32, la eleccin y la configuracin del hardware
de almacenamiento son fundamentales.

10

En las prximas secciones se describen algunas prcticas recomendadas para la eleccin y el diseo del
almacenamiento. Para obtener una explicacin ms detallada al respecto, vea las notas del producto de
TechNet "Diseo del almacenamiento de la base de datos fsica" (http://www.microsoft.com/technet/
prodtechnol/sql/2005/physdbstor.mspx). Despus de realizar un diseo 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 artculo de prcticas recomendadas de SQL Server en TechNet "Prcticas recomendadas
de E/S antes de la implementacin" (http://www.microsoft.com/technet/prodtechnol/sql/bestpractice/
pdpliobp.mspx).
Diseo del almacenamiento fsico
Asegrese de tener en cuenta la carga de trabajo prevista en un contenedor de datos de FILESTREAM
cuando decida dnde 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 contencin.
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 separacin necesario variar de un
cliente a otro.
Tambin es posible crear un esquema de tabla dentro de SQL Server que permita el equilibrio de carga
de los datos de FILESTREAM entre varios volmenes. Esto se describe en la seccin "Equilibrio de
carga de datos de FILESTREAM".
Eleccin del nivel RAID
Las ventajas de emplear la tecnologa RAID son ampliamente conocidas, y se ha escrito mucho sobre la
eleccin de un nivel RAID adecuado para los requisitos de la aplicacin, por lo que estas notas del producto
no intentarn repetir toda esa informacin. Las notas del producto "Diseo del almacenamiento de la base
de datos fsica" mencionadas anteriormente incluyen una seccin excelente sobre los niveles RAID y la
eleccin del nivel RAID. A continuacin se ofrece informacin 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 econmico, 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 funcin del grado de creacin de reflejo
presente), pero es ms 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 eleccin 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 transmisin por secuencias de alto rendimiento de datos de
FILESTREAM, la eleccin 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 quizs no proporcione
un alto grado de resistencia ante errores. Por otra parte, la eleccin inmediata puede ser usar el mismo
nivel RAID que para los dems volmenes que almacenan los datos para la base de datos, pero esto
quizs no proporcione los niveles de rendimiento que la carga de trabajo demanda.

11

En estas notas del producto, queremos destacar que se debe realizar una eleccin consciente del nivel
RAID para los volmenes de contenedores de datos de FILESTREAM despus de evaluar las ventajas
y las desventajas, no decidir basndose en un nico factor.
Eleccin de la interfaz de unidad
En las bases de datos tpicas que tienen datos BLOB, el tamao total de los datos BLOB puede ser
muchas veces mayor que el tamao total de los datos estructurados. Al implementar una solucin
que implica almacenar los datos de FILESTREAM en volmenes diferentes, quizs desee usar un
almacenamiento ms barato para el volumen, como IDE o SATA (en lo sucesivo denominado
simplemente "SATA"), en lugar de un almacenamiento SCSI ms costoso. Antes de tomar esta decisin,
hay que entender las ventajas y desventajas que ello implica. Esta seccin proporciona informacin
general de las distintas caractersticas de SCSI frente a IDE/SATA para que pueda tomar una decisin
informada basndose en el rendimiento, la confiabilidad y el costo.
Capacidad y rendimiento
Las unidades SATA suelen tener ms 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 mayora 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 mtrica de comparacin til, las dos cifras que se deben usar
realmente para realizar una comparacin son la latencia (el tiempo que transcurre hasta que el cabezal
del disco se encuentra en la posicin adecuada sobre la superficie del disco) y las velocidades de
transferencia medias (cuntos datos se puede transferir hacia y desde la superficie del disco por
segundo). Tambin es importante que las unidades puedan procesar patrones complejos de E/S de
forma eficiente. A la hora de elegir las unidades, asegrese 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
proporcionarn mejor rendimiento de transmisin de datos, pero posiblemente a un costo mayor.
Confiabilidad
SQL Server emplea la ordenacin de escritura garantizada y la durabilidad para proporcionar confiabilidad
y capacidad de recuperacin gracias a su mecanismo de registro de escritura previa. Para obtener ms
informacin sobre estos requisitos de E/S, vea las notas del producto de TechNet "Conceptos bsicos 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 recuperacin despus de un error de hardware, de
software o de alimentacin. Todos los tipos de interfaces pueden admitir el intercambio en caliente para
permitir reparaciones mientras se mantiene la disponibilidad.
La caracterstica FILESTREAM se basa en dos garantas de ordenacin de escritura y durabilidad:
Durabilidad de los datos en tiempo de confirmacin de la transaccin
Registro de escritura previa para la creacin y eliminacin de archivos de FILESTREAM

12

Para lograr durabilidad de los datos, el controlador del sistema de archivos de FILESTREAM emite un
vaciado explcito de los archivos que se han modificado antes de que se confirme una transaccin (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 alimentacin, los discos que no tienen suficiente memoria cach
alimentada por batera no perdern los datos de FILESTREAM confirmados pero sin vaciar. Si las
unidades SATA no admiten una operacin de vaciado forzado, se puede ver afectada la capacidad de
recuperacin 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 ningn 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 situacin de error de alimentacin. 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 bsicamente sin conexin).
NTFS se recupera pero los cambios de los metadatos NTFS se pierden y SQL Server no puede
revertir una transaccin sin confirmar que realiza una insercin 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 transaccin sin confirmar que realiza una eliminacin 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 vnculo de FILESTREAM proporciona
un mecanismo para detectar cundo se han producido esos "daos" (mediante la ejecucin de DBCC
CHECKDB en la base de datos).
En resumen, los datos de FILESTREAM se pueden almacenar de forma confiable en volmenes 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.
Configuracin de NTFS
Incluso el subsistema de E/S mejor diseado, 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 seccin se describen algunas de las opciones de configuracin que pueden
afectar a una carga de trabajo en la que participan datos de FILESTREAM.
Para obtener informacin general ms completa sobre NTFS, vea los artculos de TechNet Library
"Referencia tcnica 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).

13

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 simulacin de rendimiento; de lo contrario, los resultados no
sern representativos del rendimiento real de FILESTREAM.
La primera opcin de configuracin consiste en deshabilitar la generacin 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 despus 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 nmero de archivos del directorio aumenta (normalmente por encima de 300.000), este proceso
lleva cada vez ms 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 smbolo del sistema y reinicie el equipo:
fsutil behavior set disable8dot3 1
Nota: esta opcin deshabilita la generacin de nombres 8.3 en todos los volmenes NTFS del servidor.
Si hay aplicaciones de 16 bits que usan algunos volmenes, pueden experimentar problemas despus
de cambiar este comportamiento.
La segunda opcin que hay que desactivar es la actualizacin 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 opcin tambin aumenta considerablemente el rendimiento. Para
desactivar este proceso, escriba lo siguiente en un smbolo del sistema y reinicie el equipo:
fsutil behavior set disablelastaccess 1
Tamao de clster
Todos los sistemas de archivos de Windows tienen el concepto de "clster", que es la unidad de asignacin
cuando se asigna espacio en disco. Como un clster es la menor cantidad de espacio en disco que se
puede asignar, si un archivo es muy pequeo, parte del clster puede quedar sin utilizar (se desperdicia).
Por tanto, el tamao de clster suele ser bastante reducido para que los archivos pequeos no
desaprovechen espacio en disco.
Los archivos grandes pueden tener asignados muchos clsteres o los archivos pueden crecer con el
tiempo y asignrseles clsteres a medida que crecen. Si un archivo crece mucho, pero en fragmentos
pequeos, es probable que los clsteres asignados no sean contiguos en el disco (es decir, sean
"fragmentos"). Esto significa que cuanto menores sean los clsteres y cuanto ms crezca un archivo,
ms "fragmentado" estar.
Por tanto, el tamao de clster es un compromiso entre desaprovechar espacio en disco y reducir la
fragmentacin. Puede encontrar informacin ms detallada sobre los diversos tamaos de clster de los
sistemas de archivos de Windows en el artculo de Knowledge Base "Tamao de clster predeterminado
para FAT y NTFS" (http://support.microsoft.com/kb/140365).

14

La recomendacin para usar FILESTREAM es que las unidades individuales de datos BLOB tengan un
tamao de 1 MB o superior. Si es as, se recomienda que el tamao de clster de NTFS para el volumen
del contenedor de datos de FILESTREAM se establezca en 64 kB para reducir la fragmentacin.
Se debe hacer manualmente porque el valor predeterminado para los volmenes NTFS de hasta 2 terabytes
(TB) es de 4 kB. Para ello se usa la opcin /A del comando format. Por ejemplo, escriba lo siguiente en
un smbolo del sistema:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:64K
Este valor se debe combinar con tamaos de bfer grandes, como se describe en la seccin
"Consideraciones sobre la optimizacin del rendimiento y las simulaciones", ms adelante en estas notas
del producto.
Administrar la fragmentacin
Como se ha descrito anteriormente, cuando muchos archivos de un volumen crecen, se fragmentan.
Esto significa que la coleccin de clsteres asignados al archivo no es contigua. Cuando el archivo se lee
secuencialmente, los cabezales del disco necesitan leer todos los clsteres 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 clsteres necesarios para alojarlos no estn
disponibles de forma contigua.
Esta fragmentacin hace que el rendimiento de lectura secuencial sea menor que cuando no hay
fragmentacin (o cuando hay poca). El problema es muy similar al de la fragmentacin de ndices dentro
de una base de datos que disminuye el rendimiento del recorrido de intervalos de consulta.
Por tanto, es esencial quitar peridicamente la fragmentacin mediante una herramienta de
desfragmentacin de disco para mantener el rendimiento de lectura secuencial. Adems, si el volumen
que se va a usar para hospedar el contenedor de datos de FILESTREAM se us previamente, o si todava
contiene otros datos, se debe comprobar el nivel de fragmentacin y corregir en caso de que sea necesario.
Compresin
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 compresin 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 compresin de NTFS, lo que produce una
sobrecarga de la CPU.
Por estos motivos, solo tiene sentido habilitar la compresin cuando los datos se puedan comprimir
mucho y cuando la CPU adicional necesaria no haga que disminuya el rendimiento de la carga de
trabajo. Tambin hay que tener en cuenta que la compresin solo se pueden habilitar cuando el tamao
de clster de NTFS es 4.096 bytes o menos.
La compresin se puede habilitar en el volumen del contenedor de datos de FILESTREAM cuando se
formatea, mediante la opcin /C del comando format. Por ejemplo:
format F: /FS:NTFS /V:MyFILESTREAMContainer /A:4096 /C

15

Tambin se puede habilitar la compresin en un volumen existente siguiendo estos pasos:
1. En Mi PC o en el Explorador de Windows, haga clic con el botn secundario en el volumen que
desee comprimir o descomprimir.
2. Haga clic en Propiedades para ver el cuadro de dilogo Propiedades.
3. En la pestaa General, active o desactive la casilla Comprimir contenido para ahorrar
espacio en disco y haga clic en Aceptar.
4. En el cuadro de dilogo Confirmar cambios de atributos, seleccione si desea que la
compresin se aplique a todo el volumen o solo a la carpeta raz.
Esto se muestra en la ilustracin siguiente.

Ilustracin 2: comprimir un volumen existente mediante el Explorador de Windows


16

Administracin del espacio
Si bien es posible colocar varios contenedores de datos de FILESTREAM en un nico volumen NTFS,
hay motivos para tener una asignacin 1:1 entre los contenedores de datos y los volmenes NTFS.
Aparte de la posible contencin 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 difcil saber qu contenedor de datos usa ms espacio en disco. Todos los
archivos de FILESTREAM se crearn 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 tambin hay uno para cada versin 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 versin especfica 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 caracterstica 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 travs de cualquier sistema de firewall. Esto tambin es
necesario para el acceso normal a recursos compartidos remotos. Para obtener ms informacin, vea el
artculo de Knowledge Base "Informacin 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 da. FILESTREAM no puede impedir que el
software antivirus examine los archivos del contenedor de datos de FILESTREAM (esto creara problemas
de seguridad). El software normalmente tiene una configuracin 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 accin necesaria.

17

Habilitar FILESTREAM en Windows
FILESTREAM es una caracterstica hbrida que requiere que tanto el administrador de Windows como el
administrador de SQL Server realicen algunas acciones antes de que se habilite la caracterstica. Esto es
necesario para mantener la separacin de tareas entre los dos administradores, especialmente si el
administrador de SQL Server no es tambin 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 instalacin de SQL Server 2008 o mediante
la ejecucin del Administrador de configuracin de SQL Server. He aqu los pasos que hay que seguir:
1. En el men Inicio, seleccione Todos los programas, seleccione Microsoft SQL Server 2008,
seleccione Herramientas de configuracin y, a continuacin, haga clic en Administrador
de configuracin de SQL Server.
2. En la lista de servicios, haga clic con el botn secundario en Servicios de SQL Server y,
a continuacin, haga clic en Abrir.
3. En el complemento Administrador de configuracin de SQL Server, busque la instancia
de SQL Server en la que desee habilitar FILESTREAM.
4. Haga clic con el botn secundario en la instancia y, a continuacin, haga clic en Propiedades.
5. En el cuadro de dilogo Propiedades de SQL Server, haga clic en la pestaa FILESTREAM.
6. Active la casilla Habilitar FILESTREAM para acceso a Transact-SQL.
7. Si desea leer y escribir datos de FILESTREAM desde Windows, haga clic en Habilitar
FILESTREAM para el acceso de transmisin por secuencias de E/S de archivos.
Escriba el nombre del recurso compartido de Windows en el cuadro Nombre de recurso
compartido de Windows.
8. Si los clientes remotos deben tener acceso a los datos de FILESTREAM que estn
almacenados en este recurso compartido, seleccione Permitir que los clientes remotos
tengan acceso de transmisin por secuencias a los datos de FILESTREAM.
9. Haga clic en Aplicar.
En la ilustracin siguiente se muestra la pestaa FILESTREAM como se describe en el procedimiento.

18


Ilustracin 3: configurar FILESTREAM mediante el Administrador de configuracin de SQL Server
Este procedimiento debe realizarse para cada instancia de SQL Server que vaya a usar la caracterstica
FILESTREAM antes de que la pueda usar SQL Server. No hay ningn especificacin 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 despus 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, despus de reiniciar la instancia de SQL Server,
todos los datos de FILESTREAM no estarn disponibles. Se mostrar la advertencia siguiente.

Ilustracin 4: advertencia que se muestra al deshabilitar FILESTREAM con el Administrador de
configuracin de SQL Server

19

Configurar SQL Server para FILESTREAM
Cada instancia de SQL Server que vaya a usar la caracterstica FILESTREAM se debe configurar por
separado, tanto en el nivel de Windows como en el de SQL Server. Despus 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 seccin se describe cmo configurar
FILESTREAM en el nivel de SQL Server y cmo crear bases de datos y tablas habilitadas para
FILESTREAM, y se explica la interaccin de FILESTREAM con otras caractersticas de SQL Server 2008.
Consideraciones sobre la seguridad
FILESTREAM requiere el uso de seguridad integrada (es decir, autenticacin de Windows). Cuando una
aplicacin 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 tambin en el nivel de Win32, siempre y cuando el token de transaccin se
obtenga en el contexto de seguridad del usuario de Windows que est abriendo el archivo.
El requisito de la autenticacin 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 aplicacin cliente a SQL Server durante
una operacin 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 automticamente 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 mtodos transaccionales admitidos, ya que el
cambio mediante otros mtodos har que el contenedor resulte daado.
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
seccin "Configurar Windows para FILESTREAM" anteriormente).
El acceso a FILESTREAM se controla dentro de SQL Server mediante sp_configure para establecer la
opcin de configuracin 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 transmisin por secuencias de Win32
En el ejemplo siguiente se muestra cmo habilitar FILESTREAM para el acceso a Transact-SQL y de
transmisin por secuencias de Win32.

EXEC sp_configure filestream_access_level, 2;
GO
RECONFIGURE;
GO


20

La instruccin RECONFIGURE es necesaria para que el valor recin 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 cdigo anterior. El valor configurado actual se puede averiguar
mediante el cdigo siguiente.

EXEC sp_configure filestream_access_level;
GO

Si FILESTREAM no est configurado en el nivel de Windows, el "config_value" (valor de configuracin)
del resultado de sp_configure ser diferente (es decir, 0) del "run_value" (valor de ejecucin) despus
de haberse ejecutado la instruccin 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 asignacin 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 instruccin 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 clusula CONTAINS FILESTREAM es necesaria para diferenciar el nuevo grupo de archivos de los
grupos de archivos normales de la base de datos. Si la caracterstica FILESTREAM est deshabilitada,
esta instruccin producir el error siguiente.

Mensaje 5591, nivel 16, estado 3, lnea 1
La caracterstica FILESTREAM est deshabilitada.



21

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 raz 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 cdigo 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 ())

22

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 clusula FILESTREAM_ON, se usar el grupo de archivos de FILESTREAM que est
configurado como el predeterminado. Esto podra no ser la configuracin 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 segn el nmero 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 tambin
una columna del tipo de datos uniqueidentifier con el atributo ROWGUIDCOL. Esta columna no debe
permitir valores NULL y debe tener una restriccin de columna nica UNIQUE o PRIMARY KEY . El valor
GUID de la columna lo suministrar una aplicacin al insertar datos o una restriccin DEFAULT que use la
funcin NEWID() (o NEWSEQUENTIALID() si se ha configurado la replicacin de mezcla, como se indica
en la seccin "Combinaciones de caractersticas y restricciones" ms adelante).
Para obtener ms informacin 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 recoleccin 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 recoleccin de elementos no utilizados quita los archivos que ya no se necesitan. Este
proceso es automtico, a diferencia de lo que ocurre en Windows SharePoint Services, donde la
recoleccin de elementos no utilizados se debe implementar manualmente en el almacn externo de BLOB.
A todas las operaciones de archivos de FILESTREAM se les asigna un nmero de secuencia de registro
(LSN) en el registro de transacciones de la base de datos. Siempre y cuando el registro de transacciones
se trunque ms all del LSN de la operacin de FILESTREAM, el archivo ya no ser necesario y puede
ser objeto de la recoleccin de elementos no utilizados. Por tanto, todo lo que pueda evitar el truncamiento
del registro de transacciones tambin puede impedir la eliminacin fsica de un archivo de FILESTREAM.
He aqu algunos ejemplos:
No se han realizado copias de seguridad de registros en el modelo de recuperacin FULL
o BULK_LOGGED.
Hay una transaccin activa de ejecucin prolongada.
El trabajo del lector del registro de replicacin no se ha ejecutado.

23

La recoleccin de elementos no utilizados de FILESTREAM es una tarea en segundo plano desencadenada
por el proceso de punto de comprobacin de la base de datos. Se ejecuta automticamente un punto de
comprobacin cuando se ha generado una cantidad suficiente de registros de transacciones. Para
obtener ms informacin, vea el tema "Puntos de comprobacin 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 mnimamente en el registro de
transacciones de la base de datos, puede pasar bastante tiempo hasta que el nmero de entradas del
registro de transacciones generadas desencadene un proceso de punto de comprobacin y se produzca
la recoleccin de elementos no utilizados. Si esto supone algn problema, puede forzar la recoleccin de
elementos no utilizados mediante la instruccin CHECKPOINT.
Consideraciones sobre la creacin de particiones
Si la tabla que contiene datos de FILESTREAM tiene particiones, la clusula FILESTREAM_ON debe
especificar un esquema de particin para los grupos de archivos de FILESTREAM basado en la funcin
de particin de la tabla. Esto es necesario porque el esquema de particin normal implicar los grupos de
archivos normales que no se pueden usar para almacenar datos de FILESTREAM. La definicin de la
tabla (en una instruccin CREATE TABLE o CREATE CLUSTERED INDEXWITH DROP_EXISTING)
especifica despus ambos esquemas de particin.
El esquema de particin 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 (

24

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 particin, el ndice no clster
subyacente que aplica la restriccin UNIQUE en el DocGUID se debe colocar explcitamente en un grupo
de archivos para que la columna DocumentID puede ser la columna de particin. Esto significa que el
cambio de particin solo es posible si se deshabilitan las restricciones UNIQUE antes de realizar el
cambio de particin, ya que son ndices no alineados y, a continuacin, se vuelven a habilitar.
Continuando con el ejemplo anterior, en el cdigo siguiente se crea una tabla y despus se intenta un
cambio de particin.

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 particin y se genera el mensaje siguiente.
Mensaje 7733, nivel 16, estado 4, lnea 1
Error de la instruccin 'ALTER TABLE SWITCH'. La tabla
'FileStreamTestDB.dbo.DocumentStore' tiene particiones, mientras que el ndice
'UQ_Document_8CC1617F60ED59' no las tiene.

25

Al deshabilitar el ndice nico en la tabla de origen e intentarlo de nuevo se obtiene el cdigo siguiente.

ALTER INDEX [UQ__Document__8CC331617F60ED59] ON DocumentStore DISABLE;
GO

ALTER TABLE FileStreamTest3 SWITCH PARTITION 2 TO NonPartitionedFileStreamTest3;
GO

Esto tambin produce un error y se muestra el mensaje siguiente.
Mensaje 4947, Nivel 16, Estado 1, Lnea 1
Error de la instruccin ALTER TABLE SWITCH. El ndice de la tabla de origen
'FileStreamTestDB.dbo.DocumentStore' no es idntico 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


26

Se incluir ms informacin sobre la creacin de particiones de datos de FILESTREAM en unas notas
del producto futuras sobre la creacin de particiones en SQL Server 2008.
Equilibrio de carga de datos de FILESTREAM
Tambin se puede usar la creacin de particiones para crear un esquema de tabla que permita el
equilibrio de carga de los datos de FILESTREAM entre varios volmenes. Puede resultar conveniente
por diversas razones como limitaciones del hardware o para permitir el almacenamiento de zonas activas
de una tabla en volmenes diferentes.
En el cdigo siguiente se muestra una funcin y un esquema de particin segn la columna
uniqueidentifier que reparte eficazmente los datos de FILESTREAM en 16 volmenes 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'),

27

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 funcin de particin basada en los 6 ltimos bytes del GUID

28

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 particin de FILESTREAM que permita la asignacin 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

29


-- Crear un esquema de particin de datos para aplicar la tcnica 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 fcilmente mediante el cdigo siguiente.

SET NOCOUNT ON;
GO


30

-- 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 distribucin
SELECT COUNT ($PARTITION.LoadBalance_PF (DocGUID))
FROM DocumentStore
GROUP BY $PARTITION.LoadBalance_PF (DocGUID);
GO

Los resultados de una ejecucin 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 caractersticas y restricciones
Puesto que la caracterstica FILESTREAM almacena datos dentro del sistema de archivos, hay algunas
restricciones y consideraciones sobre la combinacin de FILESTREAM con otras caractersticas de SQL
Server. Esta seccin proporciona informacin general sobre las combinaciones de caractersticas que
debe conocer. Para obtener ms informacin, vea el tema "Compatibilidad de FILESTREAM con otras
caractersticas de SQL Server" (http://msdn.microsoft.com/es-es/library/bb895334.aspx) en los Libros en
pantalla de SQL Server 2008.
Replicacin
Tanto la replicacin transaccional como la replicacin de mezcla admiten datos de FILESTREAM, pero
hay que tener en cuenta muchos aspectos como los siguientes:
Cuando la topologa de replicacin incluye instancias que usan versiones diferentes de SQL
Server, existen limitaciones en cuanto al tamao de los datos que se pueden enviar a instancias
de nivel inferior.
Las opciones de filtro de replicacin determinan si el atributo FILESTREAM se replica o no
mediante replicacin transaccional.

31

El tamao del valor mximo de datos varbinary(max) que se puede replicar en la replicacin
transaccional sin replicar el atributo FILESTREAM es 2 GB.
Cuando se usa la replicacin de mezcla, tanto ella como FILESTREAM necesitan una columna
uniqueidentifier. Hay que tener cuidado con el esquema de la tabla cuando se usa la replicacin
de mezcla para que los GUID sean secuenciales (es decir, use NEWSEQUENTIALID() en lugar
de NEWID()).
Creacin de reflejo de la base de datos
La creacin de reflejo de la base de datos no admite FILESTREAM. No se puede crear un grupo de
archivos FILESTREAM en el servidor principal. La creacin 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 mtodos de cifrado de SQL Server. Si el
cifrado de datos transparente est habilitado, los datos de FILESTREAM no se cifran.
Clsteres de conmutacin por error
FILESTREAM se admite totalmente con clsteres de conmutacin por error. Todos los nodos del clster
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 estn disponibles en todos los nodos.
Para obtener ms informacin, vea en los Libros en pantalla de SQL Server 2008 el tema: "Configurar
FILESTREAM en un clster de conmutacin por error" (http://msdn.microsoft.com/es-es/library/cc645886.aspx).
Texto completo
La indizacin 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 extensin de
nombre de archivo para los datos BLOB que se almacenan en la columna FILESTREAM.
Instantneas de base de datos
SQL Server no admite instantneas de base de datos para los contenedores de datos de FILESTREAM.
Si se incluye un archivo de datos de FILESTREAM en una clusula CREATE DATABASE ON, se
producir un error en la instruccin y se generar el mensaje correspondiente.
Si una base de datos contiene datos de FILESTREAM, todava se puede crear una instantnea 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 marcarn como sin conexin en la instantnea de base de
datos. Las consultas funcionarn de la manera esperada en la instantnea 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 instantnea, ya que no
hay ninguna manera de saber en qu estado estaban los datos de FILESTREAM en el momento
representado por la instantnea de base de datos.
Vistas, ndices, estadsticas, 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 clster. Es posible definir una columna calculada que haga referencia
a una columna FILESTREAM, pero la columna calculada no se puede indizar.

32

No se pueden crear estadsticas 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 tambin permite los niveles de
aislamiento de lectura repetible y serializable. Adems, 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 restauracin
FILESTREAM funciona con todos los modelos de recuperacin y todas las formas de copias de
seguridad y restauracin (completa, diferencial y de registros). En una situacin de desastre, si se
especifica la opcin CONTINUE_AFTER_ERROR en una opcin BACKUP o RESTORE, los datos de
FILESTREAM pueden no recuperarse sin prdida de datos (similar a la recuperacin 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 versin posterior, y deben tener habilitado FILESTREAM en el nivel de Windows.
SQL Server Express
SQL Server Express admite FILESTREAM. El lmite de tamao de base de datos de 4 GB no incluye el
contenedor de datos de FILESTREAM.
Sin embargo, si se envan 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 transmisin ni de destino. Esto significa que si se forma una
cola, se puede alcanzar el lmite de tamao de base de datos de 4 GB.
En este caso, una alternativa consiste en usar un esquema donde la conversacin de Service Broker
enve las notificaciones que los datos de FILESTREAM deben enviar o recibir. A continuacin, la transmisin
real de los datos de FILESTREAM se realiza mediante acceso remoto a travs del recurso compartido de
FILESTREAM del contenedor de datos de FILESTREAM de la instancia de SQL Server Express.

33

Consideraciones sobre la optimizacin del rendimiento y las simulaciones
Hay varias consideraciones importantes a la hora de optimizar una carga de trabajo de FILESTREAM:
Asegrese de que el hardware est configurado correctamente para FILESTREAM.
Asegrese de que la generacin de nombres 8.3 est deshabilitada en NTFS.
Asegrese de que el seguimiento de la ltima hora de acceso est deshabilitado en NTFS.
Asegrese de que el contenedor de datos de FILESTREAM no se encuentre en un volumen
fragmentado.
Asegrese de que el tamao de datos BLOB sea adecuado para el almacenamiento con
FILESTREAM.
Asegrese de que los contenedores de datos de FILESTREAM tengan sus propios volmenes
dedicados.
Un factor importante que hay que destacar es el tamao de bfer usado por el protocolo SMB que se
emplea para almacenar en bfer las lecturas de datos de FILESTREAM. En las pruebas con el sistema
operativo Windows Server 2003, los tamaos de bfer mayores suelen lograr un mejor rendimiento,
con tamaos de bfer de un mltiplo de aproximadamente 60 kB. Los tamaos de bfer mayores pueden
ser ms 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):
Asegrese de que el hardware de almacenamiento y el nivel RAID sean los mismos en ambos casos.
Asegrese de que la configuracin de compresin del volumen sea la misma en ambos casos.
Tenga en cuenta si FILESTREAM va a realizar escritura continua segn la API en uso y las
opciones especificadas.
Consideraciones sobre la migracin de datos
Un escenario habitual con SQL Server 2008 ser la migracin de datos BLOB existentes al
almacenamiento de FILESTREAM. Si bien proporcionar una herramienta completa o un conjunto de
cdigo para realizar esas migraciones queda fuera del mbito de estas notas del producto, a
continuacin se muestra un flujo de trabajo simple que se puede seguir:
Revisar las consideraciones de tamao de datos para usar FILESTREAM con el fin de
asegurarse de que los tamaos de datos promedio implicados son tales que el almacenamiento
de FILESTREAM resulta adecuado.
Revisar la informacin disponible sobre las combinaciones de caractersticas y las limitaciones
para asegurarse de que el almacenamiento de FILESTREAM funcionar con todos los dems
requisitos de la aplicacin.
Seguir las recomendaciones de la seccin "Consideraciones sobre la optimizacin 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 ubicacin 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.

34

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.
Prcticas recomendadas para el uso de FILESTREAM
Esta seccin es una coleccin de prcticas recomendadas que han surgido del uso de FILESTREAM
durante las pruebas internas y pblicas de la versin preliminar de la caracterstica. Como ocurre con
todas las prcticas recomendadas, se trata de generalizaciones y quizs no sean aplicables a todas las
situaciones y todos los escenarios. Las prcticas recomendadas son las siguientes, sin ningn orden
concreto:
Se deben evitar varias anexiones pequeas un archivo de FILESTREAM siempre que sea
posible, ya que cada anexin 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 despus anexarlas a la columna
FILESTREAM cuando se alcance un umbral de tamao.
En el caso de una carga de trabajo con muchas escrituras multiproceso, considere la posibilidad
de configurar el parmetro AllocationSize para las API OpenSqlFilestream o SqlFilestream. Unos
tamaos de asignacin iniciales mayores limitarn la posibilidad de fragmentacin en el nivel del
sistema de archivos, especialmente cuando se combinan con un tamao de clster 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 fsico, 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 bferes cuyo tamao sea mltiplos de 60 kB (como se ha descrito anteriormente).
El tamao 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 tamao de archivo de
FILESTREAM. La columna calculada se actualiza mientras el archivo ya est abierto para operaciones
de escritura.
Conclusin
En estas notas del producto se ha descrito la caracterstica FILESTREAM de SQL Server 2008
que permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinacin
de SQL Server 2008 y el sistema de archivos NTFS. Para concluir, merece la pena reiterar los
puntos principales destacados en este documento.

35

El almacenamiento de FILESTREAM no resulta adecuado en todos los casos. Segn estudios
anteriores y el comportamiento de la caracterstica FILESTREAM, es mejor almacenar como
datos FILESTREAM los datos BLOB con un tamao de 1 MB o ms a los que no se va
a obtener acceso mediante Transact-SQL.
Tambin hay que tener en cuenta la carga de trabajo de actualizacin, ya que cualquier
actualizacin 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 caractersticas para asegurarse de que
la implementacin se realiza correctamente. Por ejemplo, en SQL Server 2008 RTM, la creacin
de reflejo de la base de datos no puede usar datos de FILESTREAM ni aislamiento de instantnea.
Se admiten la mayora de las dems combinaciones de caractersticas, pero algunas pueden
tener ciertas limitaciones (como la replicacin). Estas notas del producto no proporcionan una
taxonoma exhaustiva de las caractersticas y su interaccin, por lo que se deben consultar las
secciones ms recientes de los Libros en pantalla de SQL Server antes de la implementacin,
especialmente porque es posible que algunas limitaciones aumenten en futuras versiones.
Por ltimo, si FILESTREAM se implementa sin configurar correctamente Windows y SQL Server,
quizs no se alcancen los niveles de rendimiento previstos. Se deben usar las prcticas
recomendadas y los detalles de configuracin descritos anteriormente como ayuda para evitar
problemas de rendimiento.

Para obtener ms informacin:
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? Proporcinenos su opinin. Dganos, en una escala de
1 (poco til) a 5 (excelente), cmo calificara este documento y por qu lo valora con esta
puntuacin. Por ejemplo:
Lo valora alto debido a que tiene buenos ejemplos, capturas de pantalla excelentes,
una redaccin comprensible u otra razn?
Lo valora bajo debido a que sus ejemplos son escasos, las capturas de pantalla son
borrosas o su redaccin es poco clara?
Esta informacin nos ayudar a mejorar la calidad de las notas del producto que publicamos.
Enviar comentarios.

You might also like