Usuário com melhor resposta
particionamento de tabelas com indices

Pergunta
-
Bom dia ,
Estou fazendo o particionamento de algumas tabelas com grande volume de dados, essas tabelas já existem e tenho algumas duvidas.
1- ) Tenho que recriar as tabelas e os indices, ou seja, inserir todos os dados em uma tabela nova particionada e recriar os indices nela ?
2-) Não existe a possibilidade de particionar a tabela existente sem precisar recriá-la ? Se não, existe algum comando para recriála utilizando algo do tipo "select * into Tabela_Nova_Particionada From Tabela_Antiga" ?
3-) Como será o comportamento dos indices dessas tabelas ? Preciso particionar os indices de acordo com o particionamento das tabelas ? ou posso manter do jeito que está ?
Agradeço a atenção. Sds
Respostas
-
na verdade vc precisa mover a tabela para a nova partition scheme (PS), para isto dropamos PK e recriamos apontando para a PS, se o seu campo de data participa da PK ok vai funcionar, caso contrário vai falhar! ai vc vai ter crair uma tabela do zero ja apontando para a PS que vc criou... o que vc consegue é particionar apenas o INDICE, abaixo um exemplo...
--cria tabela create table tbTestePart (id int identity(1,1), nome varchar(40), dtNasc datetime) go alter table tbTestePart add constraint pk_tbTeste primary key clustered (id) go insert into tbTestePart values('C3PO','20010101') insert into tbTestePart values('R2D2','20020201') insert into tbTestePart values('YODA','20030301') insert into tbTestePart values('VADER','20040101') --cria PFN CREaTE PARTITION FUNCTION PFN_tbTestePart (datetime) AS RANGE left FOR VALUES ('2000-12-31 23:59:59:997', '2001-12-31 23:59:59:997', '2002-12-31 23:59:59:997', '2003-12-31 23:59:59:997', '2004-12-31 23:59:59:997') go --Cria PS CREATE PARTITION SCHEME PS_tbTestePart AS PARTITION PFN_tbTestePart ALL TO ([primary]) GO --tenta particionar tabela existente para campo nao pertecente à PK ALTER TABLE tbTestePart DROP CONSTRAINT pk_tbTeste GO ALTER TABLE tbTestePart ADD CONSTRAINT pk_tbTeste PRIMARY KEY CLUSTERED (id) ON PS_tbTestePart(dtNasc) GO --toma erro pois o campo dtNAsc não participa da PK --particiona indice create index ix_tbTestePart on tbTestePart (dtNasc) on PS_tbTestePart(dtNasc) --elimina tabela drop table tbTestePart
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Marcado como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:49
- Não Marcado como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:49
- Sugerido como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:50
- Marcado como Resposta Eder Costa sexta-feira, 18 de fevereiro de 2011 18:08
Todas as Respostas
-
Feliti
Segue respostas...
1- Não precisa recriar a tabela toda... basta recriar ao PK
2- Mesma resposta da 1
3- Vc pode manster... mas é mais performatico se vc fizer o alinhamento (particinar igual a tabela)OBS. estou escrevendo um artigo sobre o assunto para a SQL Magazine... acredito que este artigo vai te ajudar...
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:49
-
-
segue um script (o problema são as FKs que vc deverá refazer)
ALTER TABLE sua_tabela DROP CONSTRAINT PK_sua_tabela GO ALTER TABLE sua_tabela ADD CONSTRAINT PK_sua_tabela PRIMARY KEY CLUSTERED (seu_campo) ON PS_seu_partiton_scheme(campo_particionado) GO
Att.
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
Ok, só queria me certificar do seguinte:
Estou utilizando como campo de particionamento a (Data de Gravacao) da tabela, mas a PK da tabela é um outro campo ID_tabela.
Preciso criar uma chave ou indice na coluna que está sendo utilizada no particionamento ?
Grato,
-
na verdade vc precisa mover a tabela para a nova partition scheme (PS), para isto dropamos PK e recriamos apontando para a PS, se o seu campo de data participa da PK ok vai funcionar, caso contrário vai falhar! ai vc vai ter crair uma tabela do zero ja apontando para a PS que vc criou... o que vc consegue é particionar apenas o INDICE, abaixo um exemplo...
--cria tabela create table tbTestePart (id int identity(1,1), nome varchar(40), dtNasc datetime) go alter table tbTestePart add constraint pk_tbTeste primary key clustered (id) go insert into tbTestePart values('C3PO','20010101') insert into tbTestePart values('R2D2','20020201') insert into tbTestePart values('YODA','20030301') insert into tbTestePart values('VADER','20040101') --cria PFN CREaTE PARTITION FUNCTION PFN_tbTestePart (datetime) AS RANGE left FOR VALUES ('2000-12-31 23:59:59:997', '2001-12-31 23:59:59:997', '2002-12-31 23:59:59:997', '2003-12-31 23:59:59:997', '2004-12-31 23:59:59:997') go --Cria PS CREATE PARTITION SCHEME PS_tbTestePart AS PARTITION PFN_tbTestePart ALL TO ([primary]) GO --tenta particionar tabela existente para campo nao pertecente à PK ALTER TABLE tbTestePart DROP CONSTRAINT pk_tbTeste GO ALTER TABLE tbTestePart ADD CONSTRAINT pk_tbTeste PRIMARY KEY CLUSTERED (id) ON PS_tbTestePart(dtNasc) GO --toma erro pois o campo dtNAsc não participa da PK --particiona indice create index ix_tbTestePart on tbTestePart (dtNasc) on PS_tbTestePart(dtNasc) --elimina tabela drop table tbTestePart
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Marcado como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:49
- Não Marcado como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:49
- Sugerido como Resposta Roberto F FonsecaModerator quarta-feira, 16 de fevereiro de 2011 23:50
- Marcado como Resposta Eder Costa sexta-feira, 18 de fevereiro de 2011 18:08