10.4. Carga dos dados no banco

Pode ser necessário efetuar um grande número de inserções em tabelas para fazer a carga inicial do banco de dados. Abaixo são mostradas algumas dicas e técnicas para tornar esta carga a mais eficiente possível.

10.4.1. Desativar a auto-efetivação

Desativar a auto-efetivação (autocommit) e fazer apenas uma efetivação no final (Em SQL puro e simples isto significa executar o BEGIN no começo e o COMMIT no fim. Algumas bibliotecas cliente fazem isto automaticamente e, neste caso, é preciso ter certeza que a biblioteca está realmente fazendo quando é necessário ser feito). Se for permitido efetivar cada inserção separadamente, o PostgreSQL terá muito trabalho cada vez que uma linha for inserida. Um benefício adicional de fazer todas as inserções em uma transação é que, quando a inserção de uma linha falha a transação é desfeita, desconsiderando todas as linhas inseridas até este ponto, não produzindo uma carga parcial dos dados.

10.4.2. Utilização do COPY FROM

Em vez de utilizar vários comandos INSERT, deve ser utilizado o COPY FROM STDIN para carregar todas as linhas em um único comando, obtendo uma redução substancial de esforço gerado pela análise, planejamento, etc. Se isto for feito então não será necessário desativar a auto-efetivação, porque se trata de um único comando.

10.4.3. Remoção dos índices

Se estiver sendo carregada uma tabela recém criada, a maneira mais rápida é criar a tabela, carregar os dados com o COPY e, então, criar todos os índices necessários para a tabela. Criar um índice sobre dados pré-existentes é mais rápido que fazer de forma incremental durante a carga de cada linha.

Para carregar uma tabela existente, pode ser executado o comando DROP INDEX, carregar a tabela e, então, recriar o índice. É claro que o desempenho do banco de dados para os outros usuários será afetado negativamente durante o tempo que o índice não existir. Deve-se pensar duas vezes antes de remover um índice único, porque a verificação de erro efetuada pela restrição de unicidade não existirá enquanto o índice não for criado novamente.

10.4.4. Executar o comando ANALYZE depois

É aconselhado executar o comando ANALYZE ou VACUUM ANALYZE sempre que forem adicionados ou excluídos muitos dados, inclusive logo após a carga inicial da tabela. Este procedimento garante que o planejador dispõe de estatísticas atualizadas relativas à tabela. Sem estatísticas, ou com estatísticas obsoletas, o planejador pode fazer escolhas ruins para os planos das consultas, ocasionando um mau desempenho das consultas que utilizam a tabela.