Usuário com melhor resposta
Particionamento automático de tabela

Pergunta
-
Olá,
Preciso automatizar o processo de particionamento de uma tabela fato bem grande, algo entre 10 e 20 milhões de linhas mes.
O particionamento deve ser feito mensalmente e tenho que criar partição para o novo mes automaticamente.
A mudança de endereço dos filegroups ou compressão dos dados será feita manualmente pelos DBAs, mas os SPLITS de partições deverá ser feita pelo nosso setor.
Porém eu nunca fiz nada disso.
Para novas partições, devemos sempre usar o filegroup primary
Devemos fazer isso por Stored Procedure que vai ser executada diáriamente e devemos criar a partição antes do novo mes começar (assim que será necessário fazer o tal do sliding windows cenário que eu acho que não vai ser o caso aqui).
E se eu simplesmente rodar todo dia 20 algo como esse abaixo:ALTER
PARTITION FUNCTION Partition_Function_Do_Miguel()
SPLIT
RANGE ('20110401') -- colocar yyyymmdd para o primeiro dia do mes seguinteGO
grato,
Miguel Salles Analista Programador BI- Editado Miguel Salles terça-feira, 29 de março de 2011 14:44 melhoria
- Movido Gustavo Maia Aguiar terça-feira, 29 de março de 2011 16:36 (De:SQL Server - Desenvolvimento Geral)
Respostas
-
Miguel
E as partições antigas vc não vai eliminar ou fazer um slide Window?
se for so criar mais partição esta correto, mas não esqueça que vc também precisa inserir um novo boundary para a sua Partition Funtion...
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Marcado como Resposta Miguel Salles quarta-feira, 10 de agosto de 2011 19:26
-
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spu_update_datepartitionboundary]') AND type in (N'P', N'PC')) CREATE PROCEDURE [dbo].[spu_update_datepartitionboundary] @DateBoundary datetime, AS BEGIN IF NOT EXISTS (SELECT PF.[name], PRV.boundary_id, PRV.[value] FROM sys.partition_range_values AS PRV INNER JOIN sys.partition_functions AS PF ON PRV.function_id = PF.function_id and PRV.[value] = @DateBoundary ) ALTER PARTITION SCHEME MIGUEL_PartitionScheme NEXT USED [PRIMARY] IF NOT EXISTS (SELECT PF.[name], PRV.boundary_id, PRV.[value] FROM sys.partition_range_values AS PRV INNER JOIN sys.partition_functions AS PF ON PRV.function_id = PF.function_id and PRV.[value] = @DateBoundary ) ALTER PARTITION FUNCTION MIGUEL_PartitionFunction() SPLIT RANGE (@DateBoundary) END
Pronto, criei uma stored procedure para mudar a tal da function, mas tive que colocar também um pouco de código para aumentar mais a partição.
Está correto isso? posso passar para o DBA como se eu soubesse o que estou fazendo?
Miguel Salles Analista Programador BI- Marcado como Resposta Miguel Salles quarta-feira, 10 de agosto de 2011 19:26
Todas as Respostas
-
Miguel,
Para se fazer um particionamento de tabelas, é necessario um nvo filegroup e um novo datafile, não ha outra maneira de fazer isso, quando voce diz particionamento esta se referencido a literalmente table pertition ou separar os dados antigos da tabela?
------------------------------------------------------------- Oracle OCA11g -
Olá Fabrizzio,
O pessoal de banco de dados pediu somente que eu crie a tabela particionada por meses, vou criar tudo no desenvolvimento que só tem filegroup PRIMARY, mas imagino que na produção existam outros.
O objetivo é colocar as partições atuais em discos mais rápidos sem compressão. Mas eu não sei o que devemos fazer para atingir esse resultado.
Agradeço a ajuda,
Miguel Salles Analista Programador BI -
Miguel
Ja passei por isto..
Vc deverá fazer uma proc e agendar... para facilitar vc pode usar um unico File Group.. mas poderá obter melhor performance distribuindo em discos ....
eu fiz uma rotina que fazia o split depois o merge...
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spu_update_datepartitionboundary]') AND type in (N'P', N'PC')) CREATE PROCEDURE [dbo].[spu_update_datepartitionboundary] @DateBoundary datetime, AS BEGIN IF NOT EXISTS (SELECT PF.[name], PRV.boundary_id, PRV.[value] FROM sys.partition_range_values AS PRV INNER JOIN sys.partition_functions AS PF ON PRV.function_id = PF.function_id and PRV.[value] = @DateBoundary ) ALTER PARTITION SCHEME MIGUEL_PartitionScheme NEXT USED [PRIMARY] IF NOT EXISTS (SELECT PF.[name], PRV.boundary_id, PRV.[value] FROM sys.partition_range_values AS PRV INNER JOIN sys.partition_functions AS PF ON PRV.function_id = PF.function_id and PRV.[value] = @DateBoundary ) ALTER PARTITION FUNCTION MIGUEL_PartitionFunction() SPLIT RANGE (@DateBoundary) END
Pronto, criei uma stored procedure para mudar a tal da function, mas tive que colocar também um pouco de código para aumentar mais a partição.
Está correto isso? posso passar para o DBA como se eu soubesse o que estou fazendo?
Miguel Salles Analista Programador BI- Marcado como Resposta Miguel Salles quarta-feira, 10 de agosto de 2011 19:26
-
Miguel
E as partições antigas vc não vai eliminar ou fazer um slide Window?
se for so criar mais partição esta correto, mas não esqueça que vc também precisa inserir um novo boundary para a sua Partition Funtion...
Att.
Marcelo FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Marcado como Resposta Miguel Salles quarta-feira, 10 de agosto de 2011 19:26
-
Oi,
Espero que eu tenha a oportunidade de melhorar minha procedure, fazer a tal da slide window para ficar automático o uso da partição rápida, vou perguntar se elas já existem e qual os nomes.
Tentarei fazer o serviço completo para facilitar a vida de todo mundo. Isso porque eu li que não é possivel simplesmente mudar o filegroup de uma partição. Então é melhor eu tentar ajudar logo de cara trabalhando com 2 partições ao menos, atual e histórica.
E toca a pesquisar mais.
Miguel Salles Analista Programador BI