Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
1245
Assunto : SQL Server
Titulo: Movendo uma tabela para outro filegroup

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon


Conforme organizamos nosso banco com múltiplos filegroups, a necessidade de mudar uma tabela para um novo filegroup pode surgir naturalmente.

É uma operação pesada, especialmente com tabelas grandes, mas felizmente pode ser feita com algumas instruções simples.

O truque é que o índice clustered determina a localização das páginas da tabela. Assim sendo, para mover a tabela para um novo filegroup basta criarmos um novo indice clustered no novo filegroup. O indice pode ser apagado depois, sem problemas, o processo de criação irá se encarregar de mover as páginas.

Claro que a maioria das tabelas já possui indice clustered, na maioria dos casos na chave primária, então vai ser necessário usar a clausula DROP_EXISTING na criação do índice.

Veja um script de exemplo:

-- Criando o banco. Ajuste os caminhos
CREATE DATABASE Sales
on Primary
(NAME = Sales_dat, FILENAME = 'C:\BancosAdmin\Sales.mdf', SIZE = 8MB, MAXSIZE = 500MB, FILEGROWTH = 20% ),
Filegroup FG1 -- Default
(NAME = Sales_dat2, FILENAME = 'C:\BancosAdmin\Sales2.ndf', SIZE = 8MB, MAXSIZE = 500MB, FILEGROWTH = 20% ),
(NAME = Sales_dat3, FILENAME = 'C:\BancosAdmin\Sales3.ndf', SIZE = 8MB, MAXSIZE = 500MB, FILEGROWTH = 20% )
LOG ON
(NAME = Sales_log, FILENAME = 'C:\BancosAdmin\Sales.ldf', SIZE = 20MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10MB );
go

use sales
go

create table teste
( id int identity(1,1) primary key,
valor int)
go

create table teste2
( id int identity(1,1),
valor int)
go

-- inserir 20 registros
insert into teste values(10)
go 20

-- inserir 20 registros
insert into teste2 values(10)
go 20

-- Identificar o filegroup das tabelas
SELECT OBJECT_SCHEMA_NAME(t.object_id) AS schema_name
,t.name AS table_name
,i.index_id
,i.name AS index_name
,p.partition_number
,fg.name AS filegroup_name
,FORMAT(p.rows, '#,###') AS rows
FROM sys.tables t
INNER JOIN sys.indexes i ON t.object_id = i.object_id
INNER JOIN sys.partitions p ON i.object_id=p.object_id AND i.index_id=p.index_id
LEFT OUTER JOIN sys.partition_schemes ps ON i.data_space_id=ps.data_space_id
LEFT OUTER JOIN sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id AND p.partition_number=dds.destination_id
INNER JOIN sys.filegroups fg ON COALESCE(dds.data_space_id, i.data_space_id)=fg.data_space_id
go

-- Mover a tabela significa mover
-- o indice clustered
-- o nome precisa ser o mesmo do indice existente
CREATE UNIQUE CLUSTERED INDEX PK__teste__3213E83F4103C3F0 ON teste (ID)
WITH (DROP_EXISTING = ON) ON [FG1]


--Se a tabela não tem indice clustere, cria-se um
CREATE UNIQUE CLUSTERED INDEX novoindice ON teste2 (ID)
ON [FG1]

-- podemos apagar o indice
drop index teste2.novoindice

-- Identificar o filegroup das tabelas
SELECT OBJECT_SCHEMA_NAME(t.object_id) AS schema_name
,t.name AS table_name
,i.index_id
,i.name AS index_name
,p.partition_number
,fg.name AS filegroup_name
,FORMAT(p.rows, '#,###') AS rows
FROM sys.tables t
INNER JOIN sys.indexes i ON t.object_id = i.object_id
INNER JOIN sys.partitions p ON i.object_id=p.object_id AND i.index_id=p.index_id
LEFT OUTER JOIN sys.partition_schemes ps ON i.data_space_id=ps.data_space_id
LEFT OUTER JOIN sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id AND p.partition_number=dds.destination_id
INNER JOIN sys.filegroups fg ON COALESCE(dds.data_space_id, i.data_space_id)=fg.data_space_id
go


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br