Particionamento de Tabelas no PostgreSQL

O Blog mudou de endereço. Para acessar esse post clique aqui

610-16_Database_Avatar Twitter

Kenia Milene

Visualizar perfil de Kenia Milene Galiego no LinkedIn

Anúncios

16 thoughts on “Particionamento de Tabelas no PostgreSQL

  1. Obrigado.
    Estava correndo atrás de exemplos como esse a muito tempo. Se tiver mais exemplos é só publicar que, pelo menos eu, agradeço imensamente.

    Gostar

  2. primeiro gostei muito do seu site sobre o assunto. Acho q vou precisar dos seus trabalhos profissionais, tipo uma consultoria, caso eu feche um contrato q estou batalhando a um tempo…. se vc pudesse me passar seus contatos. meu e-mail acima tb é msn.(marcio@itarget.com.br)
    agora sobre minha dúvida desta tabela. uso muito trigrer e tem situações q preciso consultar informacoes antigas antes de permitir uma inserção, pensando em dividir a tabela mae em outras como vai funcionar estas consultas, vai procurar automaticamente nas novas tabelas, sem precisar alterar o código. aguardo retorno….

    Gostar

  3. Gostei do seu exemplo, mas não entendi o motivo de criar as views. Seria a mesma coisa de ficar criando tabelas a cada mês.
    Você poderia colocar no seu exemplo, o que a meu ver é o principal motivo de usar uma particionamento, colocar o banco para escolher as tabelas automaticamente, quando for fazer uma consulta na tabela mãe.

    Gostar

  4. Implementei minha base de acordo com seu exemplo. Em algumas situações tive até 100% de melhora no desempenho, em outras 0%. Muito bom.
    A idéia citada acima por Diogo é uma boa. Também não entendi as views.

    Gostar

  5. Uma dúvida: Eu fiz os testes aqui, criei uma estrutura um pouco diferente da tabela, quando rodo os inserts para testes, eu notei que realmente está salvando os dados distribuídos, mas, também são salvos na tabela master. Fica minha pergunta: Qual a vantagem disto no final das contas? Se as consultas são realizadas na tabela master, pra que servem as tabelas filhas distribuidas? Não ficou claro isso pra mim, se alguem souber me explicar, agradeço!

    Gostar

    • Voce deve ter feito alguma coisa errada na montagem do teu cenário, o que deveria acontecer é a tabela pai ficar vazia, e as tabelas filhas conterem as informacoes. No caso que vc comentou rafael, ao inserir as informações ficam duplicadas.

      Gostar

  6. Conforme prometido. Este é um exemplo em que crio uma tabela “mãe” e faça as tabelas “filhas” (particionamento) só quando necessário:

    –============ LAB 2: particionar tabela por ano; de minha parte, criar a tabela em tempo de execução

    — Tabela mãe – a única criada antecipadamente
    create table tb_aluno (
    codigo serial primary key,
    materia varchar(50),
    ano integer);

    — Função para criar dinamicamente a tabela (se ainda não existir) e inserir o registro … UFA! Essa deu trabalho!
    create or replace function fn_insere_aluno_ano(char, integer)
    returns void as $$
    declare
    comandosql text;
    nometabela text;
    tabela record;
    begin
    nometabela := ‘tb_aluno_’ || cast($2 as text);
    — Verifica se a tabela existe
    comandosql := ‘select tablename from pg_tables where tablename = ‘ || quote_literal(nometabela) || ‘ and schemaname = any (current_schemas(true));’;
    execute comandosql into tabela;
    — Se não existe, cria
    if tabela.tablename is null then
    comandosql := ‘create table ‘ || nometabela || ‘ () inherits (tb_aluno);’;
    execute comandosql;
    end if;
    — Insere o registro
    comandosql := ‘insert into ‘ || nometabela || ‘ (materia, ano) values (‘ || quote_literal($1) || ‘, ‘ || cast($2 as text) || ‘);’;
    execute comandosql;
    end;
    $$ language ‘plpgsql’;

    — Regra de inserção
    create or replace rule insercao_geral as
    on insert to tb_aluno
    do instead select fn_insere_aluno_ano(new.materia, new.ano);

    — Alguns registros
    insert into tb_aluno (materia, ano) values (‘Ano 2001, tabela ainda não existe’, 2001);
    insert into tb_aluno (materia, ano) values (‘Ano 2001, tabela já existe 1’, 2001);
    insert into tb_aluno (materia, ano) values (‘Ano 2001, tabela já existe 2’, 2001);
    insert into tb_aluno (materia, ano) values (‘Ano 2001, tabela já existe 3’, 2001);
    insert into tb_aluno (materia, ano) values (‘Ano 2002, tabela ainda não existe’, 2002);
    insert into tb_aluno (materia, ano) values (‘Ano 2002, tabela já existe 1’, 2002);
    insert into tb_aluno (materia, ano) values (‘Ano 2002, tabela já existe 2’, 2002);
    insert into tb_aluno (materia, ano) values (‘Ano 2003, tabela ainda não existe’, 2003);
    insert into tb_aluno (materia, ano) values (‘Ano 2003, tabela já existe 1’, 2003);
    insert into tb_aluno (materia, ano) values (‘Ano 2003, tabela já existe 2’, 2003);

    — Verificação
    select * from tb_aluno;
    select * from only tb_aluno;
    select * from tb_aluno_2001;
    select * from tb_aluno_2002;
    select * from tb_aluno_2003;

    DIVIRTAM-SE!

    Gostar

  7. PRECISO DE UM SOCORRO. VC PODE ME AJUDAR
    dalminha11@yahoo.com.br, se puder me envia um email?
    Para fazer a organização dos grupos e as escolhas dos temas, cada aluno deve participar, neste recurso, optando por participar em um dos temas descritos a seguir. Para cada tema, o grupo de alunos tem liberdade para definir os dados que considerar suficientes para representar as entidades que identificar, desde que respeite o enunciado do tema.
    Grupo 3 – Drogaria:

    A gerência de uma drogaria (fictícia) deseja que o processo de trabalho dos seus vendedores seja registrado em um banco de dados. As ações cujos dados devem ser armazenadas resumem-se ao atendimento de balcão. Isto inclui a identificação do vendedor, o registro do horário de atendimento e os itens (medicamentos ou outros) que foram vendidos em um atendimento. A gerência da drogaria enfatiza a necessidade de construção de consultas que permitam relatar:

    • A média diária do volume de vendas de cada vendedor, dentro de um período determinado, para comparar a eficiência dos vendedores.
    • A média diária do volume de vendas em cada turno, dentro de um período determinado, para comparar a efetividade da drogaria ao longo do dia. Serão considerados três turnos diários, sendo o primeiro de 6h às 11h30, o segundo de 11h30 às 17h, e o terceiro de 17h às 22h30.
    • A média diária do volume de vendas em cada mês do ano, para analisar o impacto que eventos associados a épocas do ano têm nas vendas da drogaria.

    Gostar

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s