Você precisa conhecer o ArrayDML do FireDAC!

Olá, leitores!
Voltei com mais uma dica para vocês. Dessa vez, o assunto é FireDAC!
Se você já utiliza essa tecnologia de conexão e insere grandes volumes de dados na sua aplicação, convido-o a ler este artigo!

Quem um dia já não precisou inserir 5, 10, 50 mil registros no banco de dados de uma vez só? Essa necessidade é relativamente comum em ambientes de migração, ambientes centralizados, tabelas associativas (de junção) ou até mesmo por conta da regra de negócio do cliente.

A solução pode parecer um tanto quanto óbvia: inserir um registro de cada vez dentro de um loop. Porém, não é tão óbvia assim. O FireDAC traz um recurso muito útil, chamado ArrayDML, que permite a execução de instruções SQL em lote, reduzido radicalmente o tempo decorrido com a operação.

Exemplo

Para exemplificar este recurso, gerei um mock com 10 mil linhas em formato CSV, composto pelos campos “ID”, “Name”, “Email”, “Company”, “Occupation”, “City” e “University”. A intenção é percorrer o arquivo e inserir cada linha em uma tabela de um banco de dados local. Para isso, utilizaremos um componente TFDQuery com a seguinte instrução SQL:

A princípio, faríamos essa funcionalidade de uma forma, digamos, “tradicional”, executando um INSERT para cada linha, conforme o código a seguir. Apenas como fator de parâmetro, adicionei duas linhas recebendo a data e hora atual (Now) para calcular o tempo decorrido na operação:

Ao executar essa rotina, recebemos o seguinte resultado do tempo:

Tempo das inserções sem utilizar o ArrayDML

Em seguida, faremos a mesmo operação, porém, utilizando o ArrayDML. Para isso, é necessário apenas 3 ajustes:

  • Indicar o tamanho do “lote” (ou array), no qual equivale à quantidade de inserções que serão realizadas;
  • Usar métodos de preenchimento de parâmetros no “plural” (por exemplo, AsStrings ao invés de AsString);
  • Chamar o método Execute do componente TFDQuery, informando a quantidade de inserções desejadas.

Essas três alterações no código são apresentadas abaixo:

Agora, observem só o tempo total com o ArrayDML:

Tempo das inserções utilizando o ArrayDML

Menos de 1 segundo?!

Na verdade, menos de meio segundo! Com o ArrayDML, as 10 mil inserções foram executadas absurdamente mais rápido!

Para evidenciar essa diferença, fiz questão de gravar um pequeno vídeo da execução deste código. Neste vídeo, executei a aplicação em outro computador, então os tempos estão um pouco diferentes.

Pessoal, é a primeira vez que me “aventuro” na gravação de vídeos, portanto, não reparem na qualidade, ok? =D

Fico por aqui, leitores!
Um abraço e até breve.


 

André Celestino