Ho una piccola applicazione c # che utilizza Entitiy Framework 6 per analizzare i file di testo in una struttura di database.
In generale, il contenuto del file viene analizzato in 3 tabelle:
Table1 --(1-n)-- Table2 --(1-n)-- Table3
l'applicazione ha funzionato per mesi senza problemi sull'ambiente Dev, Stage e Production.
La scorsa settimana si è fermata sul palco e ora sto cercando di capire perché.
Un file contiene ~ 100 voci Tabella1, ~ 2000 voci Tabella 2, ~ 2000 voci Tabella 3
.SaveChanges()
viene chiamato dopo ogni file.
Ottengo la seguente eccezione di timeout:
Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. La dichiarazione è stata chiusa.
AutoDetectChangesEnabled
è impostato su false.
Poiché esiste una quarta tabella in cui eseguo un'istruzione di aggiornamento dopo ogni file c'erano transazioni intorno all'intera cosa, quindi ho rimosso la quarta tabella e gli elementi della transazione ma il problema persiste.
Per verificare se si tratta solo di un problema di prestazioni, ho impostato Database.CommandTimeout = 120 senza alcun effetto, dopo 2 minuti è ancora in timeout.
(Prima del problema un file veniva archiviato in circa 5 secondi, il che è assolutamente ok)
Se guardo SQL Server utilizzando SQL Server Profiler, posso vedere quanto segue dopo .SaveChanges()
è chiamato:
Profiler di SQL Server Vengono visualizzate solo le prime istruzioni INSERT
per Table3
(sempre le prime 4-15 istruzioni e tutte subito dopo .SaveChanges()
)
Successivamente: nessuna nuova voce fino al timeout.
Non ho assolutamente idea di cosa controllare perché non c'è nessun errore o qualcosa del genere nel codice.
Se guardo a SQL Server, non c'è assolutamente alcun motivo per ritardare le query o qualcosa del genere (CPU, memoria e spazio su disco sono ok).
Sarei felice per ogni commento su questo, se vuoi maggiori informazioni per favore fatemelo sapere.
I migliori saluti
Risolto il problema ricostruendo gli indici frammentati nella Tabella 1.
Il seguente articolo è stato utile per capire come occuparsi degli indici frammentati:
https://solutioncenter.apexsql.com/why-when-and-how-to-rebuild-and-reorganize-sql-server-indexes/
(Se qualche mod sta ancora pensando che questa non sia una risposta valida, qualsiasi spiegazione sarebbe ottima)