Sono in remoto selezionando i risultati da un database di produzione personalizzato con un criterio di circa tre minuti da un'applicazione C#.Riduzione del carico della CPU su una selezione remota da un database
Ogni volta che viene eseguito il comando di selezione, il PC server che sto utilizzando CPU sale fino a circa il 50%. Ma sicuramente, il carico dovrebbe essere sul database a cui mi sto connettendo?
Perché l'applicazione C# razzo al 50% finché i dati non vengono recuperati per la lettura?
Alcuni retroscena
- ho lavorato fuori dalla debug che l'istruzione Select sul database remoto dura circa 30-40 secondi, tenendo in mente che sto selezionando con un criterio che utilizza la colonna indicizzata .
- Allo stesso tempo della selezione dei dati dal DB remoto, ho monitorato il TaskManager e la CPU si è posizionata al 50% fino a quando la selezione è completa .. questo può durare circa 30-40 secondi per ogni ciclo.
- Se si seleziona nel motore sql nativo per il DB remoto, non vi è alcun ritardo nella selezione, i dati (se presenti) vengono restituiti immediatamente.
- So che non è l'analisi del set di risultati che sta prendendo il carico della CPU in quanto alcune selezioni non restituiranno nulla.
Ecco un codice che sto usando.
OdbcConnection remoteConn = new OdbcConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString());
remoteConn.Open();
OdbcCommand remoteCommand = new OdbcCommand();
remoteCommand.Connection = remoteConn;
using (remoteConn)
{
string localSql = "";
string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00
remoteCommand.CommandText = remoteSql;
OdbcDataReader remoteReader;
remoteReader = remoteCommand.ExecuteReader();
while (remoteReader.Read())
{
for (int i = 0; i < 68; i++)
{
localSql += ",'" + remoteReader[i].ToString() + "'";
}
}
}
Ho eseguito un test di prestazioni e diagnostica sull'applicazione e ha prodotto questo risultato.
Come, se del caso, posso ridurre questo carico della CPU o addirittura eliminare completamente. È completamente fuori dall'ordinario e non ho idea di come procedere.
Grazie
Alcune domande prima di suggerire una soluzione ... vedo che si sta utilizzando l'ODBC driver, ma che tipo di database ti stai collegando? Quante righe vengono restituite dalla query? Hai bisogno di tutte le 68 colonne? Infine, puoi fornire qualche contesto su dove questo codice è in esecuzione? Si sta eseguendo in un'applicazione GUI? Se è così, è in esecuzione sul thread principale? – Randy
@Randy - 1. È un DB SQL. 2. A volte circa dieci righe .. a volte nessuna. 3. Sì, tutte le colonne sono necessarie. 4. Viene eseguito in un'applicazione Windows Form. L'ho provato sul thread principale e sul background worker, nessuna differenza. EDIT: e ho anche provato in un'applicazione console, nessuna differenza di nuovo - Spero che questo aiuti. – SK2017