none
particionamento de tabelas com indices RRS feed

  • 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

    terça-feira, 15 de fevereiro de 2011 12:16

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 Fernandes


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

    terça-feira, 15 de fevereiro de 2011 18:24
    Moderador

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 Fernandes


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

    terça-feira, 15 de fevereiro de 2011 13:54
    Moderador
  • Marcelo,

    Obrigado pelas respostas, mas não entendi a 1 e 2 .

    Como faço para particionar uma tabela existente, sem ter que recriá-la ??

    Sds,

    Feliti

     

     

    terça-feira, 15 de fevereiro de 2011 14:03
  • 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

    terça-feira, 15 de fevereiro de 2011 14:12
    Moderador
  •  

    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,

    terça-feira, 15 de fevereiro de 2011 16:01
  • 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 Fernandes


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

    terça-feira, 15 de fevereiro de 2011 18:24
    Moderador