Ich muss etwa 25 tausend Zeilen in MS Access einfügen und es dauert zu lange (3 Stunden + -), gibt es eine Möglichkeit, es zu optimieren?WPF C# Access Insert Optimierung
Zuerst überprüfe ich, ob das Register in der DB existiert, wenn nicht ich einfüge, sonst aktualisiere ich. Jetzt teste ich gerade erst ein (erstes Mal, Tisch ist leer). Vor dem Einfügen muss ich einige Daten formatieren.
conn = new OleDbConnection(Conexao.getConexao());
conn.Open();
foreach (Pendencia pendencia in listaPendeciaNassau)
{
if (!PendenciaNassauExisteVerificar(pendencia.PendenciaId))
{
if (!String.IsNullOrEmpty(pendencia.Contrato))
{
//Insert na tabela do BD
OleDbCommand cmd = new OleDbCommand("INSERT INTO tblImportacao(" +
" Contrato, " +
" Tipo, " +
" PendenciaNivel, " +
" PendenciaNassauId, " +
" PendenciaTipo, " +
" GarantiaDescricao, " +
" Observacao, " +
" AberturaData, " +
" VencimentoData, " +
" CarenciaInicio, " +
" CarenciaFim, " +
" DiasDecorridos, " +
" DiasPendentes, " +
" Produto, " +
" ClienteGrupo, " +
" ClienteNome, " +
" Rating, " +
" ClienteCnpj, " +
" Officer, " +
" CentroCusto, " +
" Moeda, " +
" OperacaoValor, " +
" LiquidacaoData, " +
" PendenciaIdComposto, " +
" Lastro, " +
" Corretora, " +
" AdAm, " +
" MnMe, " +
" PendenciaTipoMacro, " +
" Segmento, " +
" PendenciaOrigem, " +
" ImportacaoData, " +
" PorContrato" +
") " +
"VALUES (" + "'" + pendencia.Contrato + "'" +
"," + "'" + pendencia.Tipo + "'" +
"," + "'" + pendencia.PendenciaNivel + "'" +
"," + "'" + pendencia.PendenciaId + "'" +
"," + "'" + pendencia.PendenciaTipo + "'" +
"," + "'" + pendencia.GarantiaDescricao + "'" +
"," + "'" + pendencia.Observacao + "'" +
"," + (String.IsNullOrEmpty(pendencia.AberturaData.Trim()) ? "null" : "#" + pendencia.AberturaData + "#") +
"," + (String.IsNullOrEmpty(pendencia.VencimentoData.Trim()) ? "null" : "#" + pendencia.VencimentoData + "#") +
"," + (String.IsNullOrEmpty(pendencia.CarenciaInicioData.Trim()) ? "null" : "#" + pendencia.CarenciaInicioData + "#") +
"," + (String.IsNullOrEmpty(pendencia.CarenciaFimData.Trim()) ? "null" : "#" + pendencia.CarenciaFimData + "#") +
"," + "'" + pendencia.DiasDecorridos + "'" +
"," + "'" + pendencia.DiasPendentes + "'" +
"," + "'" + pendencia.Produto + "'" +
"," + "'" + pendencia.ClienteGrupo + "'" +
"," + "'" + pendencia.ClienteNome + "'" +
"," + "'" + pendencia.Rating + "'" +
"," + "'" + pendencia.ClienteCnpj + "'" +
"," + "'" + pendencia.Officer + "'" +
"," + "'" + pendencia.CentroCusto + "'" +
"," + "'" + pendencia.Moeda + "'" +
"," + "'" + (String.IsNullOrEmpty(pendencia.OperacaoValor) ? String.Empty : RetornarValorMonetarioFormatado(pendencia.OperacaoValor)) + "'" +
"," + (String.IsNullOrEmpty(pendencia.LiquidacaoData.Trim()) ? "null" : "#" + pendencia.LiquidacaoData + "#") +
"," + "'" + pendencia.PendenciaIdComposto + "'" +
"," + "'" + pendencia.Lastro + "'" +
"," + "'" + pendencia.Corretora + "'" +
"," + "'" + pendencia.AdAm + "'" +
"," + "'" + pendencia.MnMe + "'" +
"," + "'" + pendencia.PendenciaTipoMacro + "'" +
"," + "'" + pendencia.Segmento + "'" +
"," + "'PGPNassau'" +
",#" + DateTime.Now + "#" +
"," + "'" + pendencia.PorContratoDescricao + "'" +
");", conn);
cmd.ExecuteNonQuery();
}
}
}
private bool PendenciaNassauExisteVerificar(int pendenciaId)
{
bool existe = false;
OleDbConnection conn = null;
#region Select e conversão do DataSet
try
{
conn = new OleDbConnection(Conexao.getConexao());
conn.Open();
//Select da tabela tblPendencia
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * " +
"FROM tblImportacao I" +
" WHERE I.pendenciaNassauId = " + pendenciaId, conn);
DataSet ds = new DataSet();
da.Fill(ds, "tblPendencia");
DataTable dt = new DataTable();
dt = ds.Tables["tblPendencia"];
if (ds.Tables != null && ds.Tables[0].Rows.Count > 0)
{
existe = true;
}
}
catch (Exception ex)
{
EventLog.WriteEntry(APLICACAO, ex.Message, EventLogEntryType.Error, 234);
}
finally { conn.Close(); }
return existe;
#endregion
}
Gibt es einen Index für 'PendenciaNassauId'? Ist dies nicht der Fall, muss die Datenbank beim Einfügen der Zeilennummer 25000 24999 andere Zeilen überprüfen, falls sie diese Zeile enthalten. Und als Sie Zeile 24999 eingefügt haben, musste es 24998 Zeilen überprüfen ... und so weiter. Es gibt noch andere Dinge, die optimiert werden müssen (z. B. keinen vollständigen 'DataAdapter' verwenden, wenn ein einfaches' Command.ExecuteScalar' genügt), aber das wäre das erste zu überprüfende Element. –
Wenn Sie immer in eine leere Tabelle einfügen, können Sie auch Duplikate in Ihren Quelldaten eliminieren, bevor Sie überhaupt mit dem Einfügen beginnen, was die Dinge sicherlich noch beschleunigen würde. Wenn Ihre Quelldaten keine Duplikate enthalten, aber möglicherweise widersprüchliche Zeilen im Ziel vorhanden sind, können Sie alle vorhandenen IDs aus dem Ziel auswählen und anschließend alle übereinstimmenden Zeilen in der Quelle entfernen. Unterm Strich minimieren Sie die Dinge, die Sie tun, um tatsächlich einzufügen. –
Wenn Sie diese große String-Verkettung jedes Mal durchführen, wird Ihre Performance ebenfalls zunichte gemacht. Sie sollten besser eine parametrisierte Abfrage in der Schleife verwenden. – Kevin