Tradução gratuita do artigo "7 dicas de práticas recomendadas para carregamento de dados em massa do PostgreSQL"
Às vezes, é necessário carregar uma grande quantidade de dados no banco de dados PostgreSQL em algumas etapas simples. Essa prática é comumente referida como importação em massa, onde um ou mais arquivos grandes servem como fonte de dados. Às vezes, esse processo pode ser inaceitavelmente lento. Existem vários motivos para esse desempenho ruim. Índices, gatilhos, chaves estrangeiras e primárias ou mesmo a gravação de arquivos WAL podem causar atrasos.
Neste artigo, forneceremos algumas dicas práticas para a importação em massa de dados para bancos de dados PostgreSQL. No entanto, pode haver situações em que nenhuma delas seja uma solução eficaz para o problema. Incentivamos os leitores a considerar os méritos e deméritos de qualquer método antes de aplicá-lo.
Dica 1. Colocando a tabela de destino no modo não conectado
No PostgreSQL9.5 e posterior, a tabela de destino pode ser definida para o modo não logado e retornada ao modo logado após carregar os dados.
ALTER TABLE <target table> SET UNLOGGED;
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED;
, PostgreSQL (WAL). . , , PostgreSQL . PostgreSQL .
, – . . , , , .
:
- c ;
- ;
- , , .
2.
. , , .
, -, , . , , , , .
DROP INDEX <index_name1>, <index_name2> … <index_name_n>
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n)
maintenance_work_mem. .
, . : . , , .
3.
, , – , . PostgreSQL .
, , . , , , .
ALTER TABLE <target_table>
DROP CONSTRAINT <foreign_key_constraint>;
BEGIN TRANSACTION;
<bulk data insert operations…>
COMMIT;
ALTER TABLE <target_table>
ADD CONSTRAINT <foreign key constraint>
FOREIGN KEY (<foreign_key_field>)
REFERENCES <parent_table>(<primary key field>)...;
, maintenance_work_mem .
4.
INSERT DELETE ( ) . , , , .
, . , .
ALTER TABLE <target table> DISABLE TRIGGER ALL;
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL;
5. COPY
PostgreSQL – COPY . COPY . , INSERT INSERT- VALUE
COPY <target table> [( column1>, … , <column_n>)]
FROM '<file_name_and_path>'
WITH (<option1>, <option2>, … , <option_n>)
COPY:
- , , ;
- ;
- ;
- WHERE.
6. INSERT VALUE
INSERT – . , INSERT , , WAL.
INSERT VALUE .
INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>)
VALUES
(<value a>, <value b>, …, <value x>),
(<value 1>, <value 2>, …, <value n>),
(<value A>, <value B>, …, <value Z>),
(<value i>, <value ii>, …, <value L>),
...;
INSERT VALUES . .
, , , PostgreSQL INSERT VALUES. INSERT, RAM , .
effective_cache_size 50%, shared_buffer 25% . , , INSERT VALUES, 1000 .
7. ANALYZE
, ANALYZE . , , . , . ANALYZE .
A importação em massa de dados para aplicativos de banco de dados não acontece todos os dias, mas afeta o desempenho da consulta. É por isso que é fundamental reduzir o tempo de carregamento tanto quanto possível. Uma coisa que o DBA pode fazer para minimizar a possibilidade de surpresas é realizar a otimização da carga em um ambiente de teste com um servidor semelhante e PostgreSQL configurado de maneira semelhante. Existem diferentes cenários para carregar dados e seria melhor tentar cada método e escolher um que funcione bem.