Upload dos dados utilizando tabelas temporárias para reduzir o número de querys ao banco

This commit is contained in:
Adriano Serighelli 2025-10-16 11:39:19 -03:00
parent 654d363d12
commit 325bc76757
3 changed files with 62 additions and 27 deletions

View File

@ -19,10 +19,10 @@ namespace Infrastructure
using var connection = new OleDbConnection(_connectionString); using var connection = new OleDbConnection(_connectionString);
await connection.OpenAsync(ct); await connection.OpenAsync(ct);
string sql = $"SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 AND Unidade_gerenciada ORDER BY cod_smart_unidade"; //string sql = $"SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 AND Unidade_gerenciada ORDER BY cod_smart_unidade";
//string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and (Cliente = 'RMC ALIMENTOS' OR Cliente = 'FERREIRA SUPERMERCADO' OR Cliente = 'VANGUARDA ALIMENTOS') AND Unidade_gerenciada ORDER BY PerfilCCEE"; //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and (Cliente = 'RMC ALIMENTOS' OR Cliente = 'FERREIRA SUPERMERCADO' OR Cliente = 'VANGUARDA ALIMENTOS') AND Unidade_gerenciada ORDER BY PerfilCCEE";
//string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'ABEVÊ' and Unidade = 'ABV LOJA 29 - COXIM' AND Unidade_gerenciada ORDER BY PerfilCCEE"; //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'ABEVÊ' and Unidade = 'ABV LOJA 29 - COXIM' AND Unidade_gerenciada ORDER BY PerfilCCEE";
//string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'calvi granitos' AND Unidade_gerenciada ORDER BY PerfilCCEE"; string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'SIDERQUÍMICA' AND Unidade_gerenciada ORDER BY PerfilCCEE";
//string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Codigo_SCDE = 'DFLBCEENTR101'"; //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Codigo_SCDE = 'DFLBCEENTR101'";
using var command = new OleDbCommand(sql, connection); using var command = new OleDbCommand(sql, connection);

View File

@ -1,4 +1,5 @@
using Domain; using System.Globalization;
using Domain;
using Npgsql; using Npgsql;
using NpgsqlTypes; using NpgsqlTypes;
@ -74,31 +75,65 @@ namespace Infrastructure
await using var connection = await _dataSource.OpenConnectionAsync(ct); await using var connection = await _dataSource.OpenConnectionAsync(ct);
using var batch = new NpgsqlBatch(connection); using var batch = new NpgsqlBatch(connection);
foreach (var m in medicoes) // Gerar os parâmetros dinamicamente, mantendo a abordagem parametrizada
var valores = medicoes
.Select((m, index) => new
{ {
var cmd = new NpgsqlBatchCommand(@" Index = index,
Ponto = m.Ponto,
DiaNum = m.DiaNum,
Minuto = m.Minuto,
Origem = m.Origem,
AtivaConsumo = m.AtivaConsumo,
AtivaGeracao = m.AtivaGeracao,
ReativaConsumo = m.ReativaConsumo,
ReativaGeracao = m.ReativaGeracao
})
.ToList();
var query = @"
UPDATE med_5min UPDATE med_5min
SET origem = @origem, SET origem = nv.origem,
ativa_consumo = @ativa_consumo, ativa_consumo = nv.ativa_consumo,
ativa_geracao = @ativa_geracao, ativa_geracao = nv.ativa_geracao,
reativa_consumo = @reativa_consumo, reativa_consumo = nv.reativa_consumo,
reativa_geracao = @reativa_geracao reativa_geracao = nv.reativa_geracao
WHERE ponto = @ponto FROM (VALUES";
AND dia_num = @dia_num
AND minuto = @minuto;");
cmd.Parameters.AddWithValue("origem", m.Origem); // Adicionar os valores para o `VALUES`
cmd.Parameters.AddWithValue("ativa_consumo", NpgsqlDbType.Numeric, m.AtivaConsumo ?? (object)DBNull.Value); for (int i = 0; i < valores.Count; i++)
cmd.Parameters.AddWithValue("ativa_geracao", NpgsqlDbType.Numeric, m.AtivaGeracao ?? (object)DBNull.Value); {
cmd.Parameters.AddWithValue("reativa_consumo", NpgsqlDbType.Numeric, m.ReativaConsumo ?? (object)DBNull.Value); query += $" (@ponto_{i}, @dia_num_{i}, @minuto_{i}, @origem_{i}, " +
cmd.Parameters.AddWithValue("reativa_geracao", NpgsqlDbType.Numeric, m.ReativaGeracao ?? (object)DBNull.Value); $"@ativa_consumo_{i}, @ativa_geracao_{i}, @reativa_consumo_{i}, @reativa_geracao_{i})";
cmd.Parameters.AddWithValue("ponto", m.Ponto); if (i < valores.Count - 1)
cmd.Parameters.AddWithValue("dia_num", m.DiaNum); {
cmd.Parameters.AddWithValue("minuto", m.Minuto); query += ", ";
}
batch.BatchCommands.Add(cmd);
} }
query += @") AS nv (ponto, dia_num, minuto, origem, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao)
WHERE med_5min.ponto = nv.ponto
AND med_5min.dia_num = nv.dia_num
AND med_5min.minuto = nv.minuto;";
// Agora, vamos adicionar os parâmetros à query
var cmd = new NpgsqlBatchCommand(query);
foreach (var valor in valores)
{
cmd.Parameters.AddWithValue($"ponto_{valor.Index}", valor.Ponto);
cmd.Parameters.AddWithValue($"dia_num_{valor.Index}", valor.DiaNum);
cmd.Parameters.AddWithValue($"minuto_{valor.Index}", valor.Minuto);
cmd.Parameters.AddWithValue($"origem_{valor.Index}", valor.Origem);
cmd.Parameters.AddWithValue($"ativa_consumo_{valor.Index}", valor.AtivaConsumo ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue($"ativa_geracao_{valor.Index}", valor.AtivaGeracao ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue($"reativa_consumo_{valor.Index}", valor.ReativaConsumo ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue($"reativa_geracao_{valor.Index}", valor.ReativaGeracao ?? (object)DBNull.Value);
}
batch.BatchCommands.Add(cmd);
// Executar a query
await batch.ExecuteNonQueryAsync(ct); await batch.ExecuteNonQueryAsync(ct);
} }
} }

View File

@ -12,8 +12,8 @@ class Program
string caminhoLog = $@"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_{inicio:MM_dd_HH_mm}.csv"; string caminhoLog = $@"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_{inicio:MM_dd_HH_mm}.csv";
//DateTime dataIni = new DateTime(inicio.Year, inicio.Month, 1); //DateTime dataIni = new DateTime(inicio.Year, inicio.Month, 1);
//DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day); //DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day);
DateTime dataIni = new DateTime(inicio.Year, 01, 01); DateTime dataIni = new DateTime(inicio.Year, 10, 01);
DateTime dataFim = new DateTime(inicio.Year, 02, 01); DateTime dataFim = new DateTime(inicio.Year, 10, 16);
// Configuração de dependências (pode usar um container DI depois) // Configuração de dependências (pode usar um container DI depois)
var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD); var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD);