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)

Figura 2. Criando um filegroup secundário
Figura 1. Figura 2. Criando um filegroup secundário

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).

Criando um filegroup secundário
Figura 2. Criando um filegroup secundário

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)

Listagem 1. Especificando o filegroup durante a criação de objetos

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.