Filegroups são estruturas lógicas - ou se preferir unidades de gerenciamento - que dão suporte aos arquivos de dados (=estruturas físicas) de um database. Todo database possui pelo menos um filegroup – o filegroup primário, gerado automaticamente no momento da criação do database (ver Figura 1)
Pode-se juntar vários arquivos físicos num mesmo filegroup, ou criar vários filegroups, mas qual a recomendação? A resposta é: depende do que você pretende exatamente :
- Se o disco onde está localizado o filegroup primário “estourou”, você poderia criar uma extensão do filegroup primário noutra unidade. Nesse caso, você criaria outro arquivo físico, mas associaria esse arquivo na mesma unidade de gerenciamento – PRIMARY ;
- Se você não possui um sistema de RAID de discos, pode obter um significativo aumento de performance distribuindo tabelas e índices em filegroups distintos, localizados em unidades com controladoras específicas – por exemplo, as tabelas ficam no filegroup PRIMARY na unidade C: e os índices no filegroup FG_Indice na unidade D:. Assim, você estará viabilizando threads paralelas para busca nas páginas de dados e índices, melhorando a performance como um todo.
Como criar um filegroup secundário para armazenamento de índices
Para criar outro filegroup, basta acessar a tela de propriedades do database (ver Figura 1) e adicionar outro filegroup (ver Figura 2).
Uma vez adicionado, basta criar tabelas no filegroup PRIMARY e índices no filegroup FG_INDICE. Para especificar o filegroup durante a criação de objetos e índices, utilize a cláusula ON ao final dos comandos CREATE TABLE, CREATE INDEX e ALTER TABLE ... ADD ... PRIMARY-KEY (ver Listagem 1)
create table pedido
(
id_pedido int not null
,dt_emissao smalldatetime not null
,id_emitente int not null
)
ON 'PRIMARY'
go
alter table pedido add constraint pk_pedido primary key clustered (id_pedido) on 'PRIMARY'
go
create nonclustered index ix_pedido on pedido (dt_emissao) on 'FG_Indice'
go
Observações:
- Se você não especificar o filegroup na criação do objeto, o objeto será criado no filegroup default (=PRIMARY) ;
- Pode-se alterar o filegroup default com o comando ALTER DATABASE:
ALTER DATABASE MODIFY FILEGROUP DEFAULT
- Como o leaf level do índice cluster ordena as páginas de dados da própria tabela, a primary key pk_pedido deve permanecer no filegroup PRIMARY
Conclusão:
Para obter performance precisamos estar sempre atentos aos detalhes. Se você não possui um sistema de RAID e quer performance, armazene índices não cluster numa unidade de disco e filegroup específicos - o resultado vale a pena.