depois de muita pesquisa e experimentação, imaginei que faria uma tentativa de obter alguns conselhos de especialistas.
Estou mantendo um procedimento armazenado que é executado como um trabalho. Ele cria uma tabela com dados bem definidos. Em seguida, ele usa um OpenQuery para coletar alguns dados e inseri-los na tabela.
Exemplo:
insert into LOCAL_TABLE
select *
from OPENQUERY(linked_server, 'select * from linktable')
O resultado da openquery é de 2,5 milhões de linhas. Isso leva cerca de 2 horas para ser concluído.
O servidor de banco de dados é um iSeries, então executei a consulta com o Visual Explain e a consulta é concluída em cerca de 1 segundo. Estou executando a consulta do MS SQL Server 2016. Ambos os servidores ficam próximos um do outro conectados por meio de um switch gigabit.
Estou tentando identificar o gargalo aqui e acredito que seja o INSERT.
Eu li sobre BULK INSERT e parece que não posso usar BULK INSERT com um OpenQuery.
Eu li sobre OPENROWSET(BULK... ), mas não acho que possa usar um servidor vinculado com isso. Tenho que manter usando o servidor vinculado para que caso o servidor mude o código não precise ser atualizado.
Finalmente, executar isso como SELECT * INTO pode aumentar o desempenho, mas os tipos de dados seriam definidos pelo conjunto de resultados. Suponho que poderia trabalhar com isso a partir daí, uma vez que seja local, mas gostaria de confirmar que vale a pena o esforço antes de embarcar nele.
Alguma recomendação de como posso melhorar o desempenho aqui?