Database invariato
Nessuna modifica a SQL Server o alla struttura dati esistente.
Case study · Performance su software esistente
Hai un gestionale in cui alcune operazioni sono diventate particolarmente lente?
Prima di intervenire sul database, aumentare le risorse del server o ipotizzare modifiche più invasive,
preferisco partire da un'analisi mirata per individuare dove si trova realmente il collo di bottiglia.
L'analisi potrebbe evidenziare che il problema non è il database, e non è necessario investire in nuove risorse hardware o modifiche invasive al sistema.
Se anche il tuo gestionale soffre di lentezza, forse questo caso reale può aiutarti, e se vuoi possiamo fare una chiacchierata per capire se posso essere di aiuto.
Un rallentamento reale su un'applicazione aziendale è stato risolto intervenendo esclusivamente sul codice C#, senza modificare SQL Server, struttura dati o comportamento funzionale.
Il problema
Il caso riguarda un gestionale .NET legacy utilizzato tra le altre cose per attività operative dei tecnici. Durante il caricamento di una pagina, una parte dell'applicazione impiegava fino a 30,3 secondi per recuperare e comporre le informazioni necessarie all'interfaccia.
Il rallentamento era percepibile nel normale utilizzo del software e aveva generato diverse lamentele da parte degli utenti. Da qui la richiesta di analizzare la causa e trovare una soluzione.
Punto chiave
Il primo risultato dell'analisi è stato escludere il database come causa del problema. Non servivano modifiche a SQL Server o alla struttura dei dati.
Il collo di bottiglia era nel modo in cui il codice applicativo recuperava e componeva le informazioni.
L'intervento
Dopo aver isolato il collo di bottiglia, ho modificato esclusivamente la strategia utilizzata dal codice C# per recuperare e comporre i dati. Input e output della funzionalità sono rimasti invariati, evitando di coinvolgere il resto dell'applicazione e mantenendo molto circoscritta l'area interessata dalla modifica. Questo ha permesso di ridurre anche il rischio di regressioni sulle funzionalità esistenti.
Nessuna modifica a SQL Server o alla struttura dati esistente.
La funzionalità ha continuato a lavorare sullo stesso scenario e sugli stessi dati.
Il risultato restituito all'applicazione non è stato ridotto o semplificato.
La correzione non ha modificato il comportamento funzionale atteso dagli utenti.
Risultato misurato
Le misure prima e dopo sono direttamente confrontabili: stesso scenario, stesso risultato funzionale e stesso database. È cambiata esclusivamente la strategia applicativa utilizzata dal codice C#.
Perché è significativo
Su un'applicazione aziendale esistente un rallentamento importante può far pensare subito al database, all'infrastruttura o alla necessità di una revisione molto più ampia del sistema.
Prima di investire in più CPU, memoria o infrastruttura, conviene verificare dove viene realmente speso il tempo. Un sistema aziendale può essere cresciuto molto rispetto a quando è stato progettato: scelte tecniche inizialmente adeguate possono diventare inefficienti quando aumentano dati, utenti e funzionalità.
In questo caso non servivano nuove risorse né una revisione generale dell'architettura. L'analisi ha individuato una criticità circoscritta nel codice applicativo e ha permesso di intervenire esclusivamente nel punto necessario, lasciando invariato ciò che già funzionava correttamente.
È un principio che applico spesso sui software con performance deludenti: non partire dalla riscrittura, ma dal comportamento reale del sistema e da ciò che produce concretamente il problema.
Il mio ruolo
Ho seguito autonomamente l'analisi del rallentamento, l'individuazione del collo di bottiglia, la definizione dell'intervento sul codice applicativo e la verifica del risultato.
Il valore non è stato soltanto rendere più veloce una funzione, ma distinguere il sintomo dalla causa e scegliere una modifica proporzionata al problema.
Approfondimento tecnico
Nel case study ho volutamente mantenuto il focus sul problema, sull'analisi e sul risultato. Nell'articolo tecnico descrivo invece il pattern di accesso ai dati che causava il rallentamento e l'intervento adottato nel codice.
Partire dal problema reale
Posso analizzare l'applicazione esistente, individuare la criticità reale e valutare se sia possibile intervenire in modo circoscritto prima di affrontare modifiche più invasive.