none
Particionamento automático de tabela RRS feed

  • 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 seguinte

    GO

    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)
    terça-feira, 29 de março de 2011 14:22

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 Fernandes


    MCP, 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
    terça-feira, 29 de março de 2011 17:06
    Moderador
  • 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
    terça-feira, 29 de março de 2011 16:40

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
    terça-feira, 29 de março de 2011 14:26
    Moderador
  • 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
    terça-feira, 29 de março de 2011 14:52
  • 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 Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    terça-feira, 29 de março de 2011 15:23
    Moderador
  • 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
    terça-feira, 29 de março de 2011 16:40
  • 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 Fernandes


    MCP, 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
    terça-feira, 29 de março de 2011 17:06
    Moderador
  • 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
    terça-feira, 29 de março de 2011 17:15