PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso usar um índice em uma tabela particionada no postgresql 8.3.7


Os índices funcionam bem para fazer uma varredura apenas das partições relevantes no PostgreSQL. Mas você precisa configurar tudo corretamente para que funcione, e é fácil perder um passo na longa lista de coisas documentadas em http://www.postgresql.org/docs/current/static/ddl-partitioning.html

A principal coisa a perceber é que para evitar uma varredura seqüencial, você deve fornecer informações suficientes ao PostgreSQL para que ele possa provar que algumas partições não podem ter os dados que você está procurando; em seguida, eles são ignorados como fontes potenciais para os resultados da consulta. O artigo para o qual você linka aponta isso como uma solução para o problema da varredura seq:"Se você adicionar restrições de intervalo ao campo de data de cada partição, essa consulta pode ser otimizada em um loop onde você consulta a partição “mais recente” primeiro e trabalha para trás até encontrar um único valor que seja maior que o intervalo de todas as partições restantes."--mas não mostra o plano aprimorado que você veria após essa alteração.

Alguns erros comuns que você pode ter cometido:

-O parâmetro constraint_exclusion no arquivo postgresql.conf está desativado por padrão. Com esse padrão, você não obterá o que espera.

-Não criou partições não sobrepostas usando CHECK, que impede o planejador de saber o que está dentro de cada uma delas. É possível perder esta etapa, mas ainda assim colocar seus dados nas partições corretas corretamente, o planejador simplesmente não saberá disso.

-Não colocou um índice em cada partição, apenas criou um na tabela master. Isso lhe dará uma varredura sequencial apenas na partição relevante, então não é tão ruim quanto o acima, mas também não é bom.

Há algum trabalho para tornar tudo isso mais fácil nas próximas versões do PostgreSQL (a configuração constraint_partition é bastante automática no 8.4 e algum tipo de automação de configuração de partição está sendo trabalhada). No momento, se você seguir as instruções cuidadosamente e evitar todos esses problemas, deve funcionar.