Melhorar performance ao copiar registros de tabelas no Firebird, utilizando External File

01/09/2020

0

Estou realizando a cópia de registros de tabelas de um banco Firebird, utilizando "external file", para outro banco vazio.

O problema acontece quando se trata de uma uma tabela muito grande (com milhões de tuplas),
o processo se torna muito lento a ponto de ficar por várias horas executando.

Processo:

1° Crio a tabela externa;

2° Faço o "insert" da seleção dos registros da tabela que quero copiar;

3° Faço o "insert" da seleção dos registros do "external file" para a tabela no banco vazio.

Obs: A parte de importar os registros do "external file" para a tabela no banco vazio é a parte que mais demora.

Já tentei algumas coisas, como alterar algumas das propriedades em "Fetch Options" do componente TFDQuery:

FDQuery.FetchOptions.Mode := fmOnDemand;
FDQuery.FetchOptions.CursorKind := ckDefault;
FDQuery.FetchOptions.Unidirectional := true;
FDQuery.FetchOptions.RowsetSize := 1000;
FDQuery.FetchOptions.AutoClose := true;


Quando altero o "Mode" para "fmAll", e se a tabela a ser copiada tiver muitos registros, dá "Out of memory".

Tentei também "overclockar" o próprio Firebird, aumentando a qtd de núcleos utilizados da cpu, memória e cache. Segue as configurações:

DefaultDbCachePages = 16384
FileSystemCacheThreshold = 268435456
FileSystemCacheSize = 80
CpuAffinityMask = 15

Mas não obtive sucesso em nenhum dos casos.

Minha perguta é, as "Fetch Options" podem realmente me ajudar a obter um melhor desempenho?
Se sim, qual seria a melhor configuração para setar?
Existe alguma outra forma para obter melhor desempenho, utilizando "external file"?
Aluisio Neto

Aluisio Neto

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar