Estou utilizando a função FWTemporaryTable para criar tabela temporária vazia, depois utilizo a função TcSqlExec para popular esta tabela utilizando o INSERT INTO.
Com a função FWBulk verifiquei na documentação que é possível utilizar para popular tabelas com ganho de performance, nos exemplos que verifiquei é utilizado em um laço de repetição com o método AddData.
Fiquei na duvida se mesmo em um laço de repetição e mais performático que a função TcSqlExec, ou se é possível passar uma query com INSERT INTO para o FWBulk?
Pela minha experiência, nesse cenário, o insert into será mais rápido, inclusive, eu recomendo ele em quase todas as conversas que tenho sobre performance.
Acontece que nem sempre é possível fazer um insert into, inclusive quando não falamos sobre tabelas temporárias. Nesses cenários, a classe FWBulk vai lhe proporcionar um excelente ganho de performance comparada a um while com RecLock e inserção de dados.
São coisas diferentes... O insert into, o banco trabalha para fazer a inserção, basicamente não existe nada de ADVPL envolvido, no caso da classe FWBulk, existe muito de ADVPL e DBAccess envolvido, mas em resumo, o ganho está no IO, a FWBulk junta dados em memória e manda "lotes" de dados para o banco.
Conclusão, no geral, eu opto por insert into e caso não seja possível, utilizo a FWBulk, claro, tudo depende muito dos cenários, regras envolvidas, massa de dados etc.