Material Filestream (webcast) + múltiplos Filestream Filegroups

Ontem eu gravei mais um webcast para o MSDN, onde apresentei o recurso Filestream do  SQL Server 2008. Estudamos um pouco da sua arquitetura e funcionamento, além de desenvolvemos uma pequena solução que manipula fotos e as armazena no banco de dado (nota: a manipulação não foi feita toda através de T-SQL, e sim usando a classe SQLFileStream, que não é muito simples, mas funciona).
Como prometido, anexo a esse post os scripts SQL e a pequena solução que montei para mostrar o uso do Filestream, façam bom uso!

Para não ficar um post muito curto, vou aproveitar o gancho da minha última resposta no webcast...

Resposta: Sim, é possível criarmos vários Filegroups do tipo Filestream para um mesmo banco de dados, além de podermos ter vários campos filestream em uma mesma tabela. Veja abaixo:

CREATE DATABASE FileStreamDB ON PRIMARY
( NAME = FileStreamDB_data,
FILENAME = N'C:\Temp\Filestream\DBs\FileStreamDB_data.mdf',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 15%),
FILEGROUP FileStreamGroup_02 CONTAINS FILESTREAM
( NAME = FileStreamDB_Docs,
FILENAME = N'C:\Temp\Filestream\DBs\Docs'),
FILEGROUP FileStreamGroup_01 CONTAINS FILESTREAM DEFAULT
( NAME = FileStreamDB_CVs,
FILENAME = N'C:\Temp\Filestream\DBs\CVs')

LOG ON
( NAME = 'FileStreamDB_log',
FILENAME = N'C:\Temp\Filestream\DBs\FileStreamDB_log.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB);
GO

Aqui eu crio dois filegroups Filestream, apontando para locais distintos. Notem que eu especifiquei qual filegroup é o default, se eu não tivesse feito isso, o primeiro Filestream declarado seria o utilizado pelas tabelas que não especificam qual Filegroup vão utilizar.

CREATE TABLE CurriculumVitae
(Codigo uniqueidentifier NOT NULL PRIMARY KEY DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Nome VARCHAR(255) NOT NULL,
CV VARBINARY(MAX) FILESTREAM,
DOC VARBINARY (MAX) FILESTREAM)
GO

CREATE TABLE CurriculumVitae2
(Codigo uniqueidentifier NOT NULL PRIMARY KEY DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Nome VARCHAR(255) NOT NULL,
CV VARBINARY(MAX) FILESTREAM,
DOC VARBINARY (MAX) FILESTREAM) FILESTREAM_ON FileStreamGroup_02
GO

Nos exemplos acima eu mostro que é possível criar dois campos do tipo Filestream na mesma tabela, sendo que a primeira vai armazenar o conteúdo dentro do filegroup 01, enquanto a última utilizará o FileStreamGroup_02.

Algo que eu não encontrei na documentação e acredito que não podemos fazer é trabalhar com dois Filestream na mesma tabela apontando para filegroups distintos. Achei a idéia um pouco forçada, mas não custava tentar. Será que realmente precisamos dessa funcionalidade?

Para  finalizar, gostaria de ressaltar a motivação para existirem filegroups de filestream diferentes em um mesmo banco de dados. Se a sua solução é muito grande e precisa escalar, não seria interessante você poder colocar aqueles arquivos que são armazenados e posteriormente somente consultados em um RAID 5 (que traz uma penalidade de escrita), enquanto mantém outros arquivos alterados com maior frequência (e quem sabe mais importantes) em um RAID 10? Com a separação dos filegroups, você têm um controle maior para fazer sua solução escalar. Outra vantagem que também podemos ter é na questão de fragmentação e manutenção dos filegroups, que separados serão menores e suas características poderão ser respeitadas.

[]s
Luciano Caixeta Moreira
luciano.moreira@microsoft.com
===============================================
This post is provided "AS IS" and confers no right
===============================================

Material_Webcast.zip