Recentemente, notei que a parte do meu processo de ETL que carrega os dados na área de preparação às vezes demora mais e às vezes demora mais.
Com a seguinte consulta (executada no banco de dados de catálogos de serviços de integração), eu estava comparando duas execuções diferentes e descobri que as instruções da tabela de recriação estão demorando muito mais (às vezes também a parte de carregamento, mas acho que o principal problema é esse) . Aqui está a consulta para comparar as diferentes execuções:
select
es1.execution_path,
es1.execution_duration as es1dura,
es2.execution_duration as es2dura,
(es2.execution_duration * 1.0) / es1.execution_duration * 100
from
catalog.executable_statistics es1
join catalog.executable_statistics es2 on es1.execution_path = es2.execution_path
where es1.execution_id = 239
and es2.execution_id = 10290
and es1.execution_path like '%create table%'
order by
--(es2.execution_duration * 1.0) / es1.execution_duration * 100 desc
es1.execution_path
Parte do resultado é este:
Isso corresponde à seguinte parte do ETL:
Não se preocupe com a linha verde adicional na captura de tela, isso é apenas uma formatação confusa no Visual Studio. Não há mais tarefas em execução em paralelo e o trabalho está sendo executado por volta da meia-noite, não há outro trabalho em execução no banco de dados ao mesmo tempo.
Essas tarefas são realmente simples. Uma das Recreate table
tarefas, por exemplo, se parece com isso:
IF EXISTS (
SELECT * FROM sys.tables
WHERE name = 'admin_perso_abteilung'
)
DROP TABLE admin_perso_abteilung
GO
CREATE TABLE admin_perso_abteilung (
[id] int,
[perso_abteilung] nvarchar(50)
)
GO
De qualquer forma, a questão é, como o resultado da consulta sugere, que todo o processo fica parado por algum tempo antes de executar as instruções de recriação da tabela em paralelo, o que poderia causar isso? O que posso inspecionar mais para restringir o problema?
Como sou mais desenvolvedor do que administrador estou um pouco perdido aqui, por favor me oriente um pouco. Obrigado.
As chances são de que suas instruções drop/create estejam bloqueando umas às outras de vez em quando. Como já mencionado, você pode truncar as tabelas, no entanto, um teste bastante simples seria executar as tarefas drop/create sequencialmente e os dados carregados posteriormente em paralelo.
Se você está desesperado para saber os motivos detalhados por trás dos tempos variáveis, faça o que foi sugerido e execute um rastreamento ou uma sessão XE para capturar bloqueios e bloqueios durante as execuções.
(mais longo que comentar... postando como resposta)
DelayValidation
a propriedade comoTrue
para a tarefa de fluxo de dados.ValidateExternalMetadata
comoFalse
para componentes de fluxo de dados individuais.