ho bisogno di conferma/spiegazione da voi pro/guru con la seguente perché la mia squadra mi sta dicendo "non ha importanza" e me :) sta fustratingSQL Performance, .Net Ottimizzazioni vs Best Practices
Sfondo : Abbiamo un SQL Server 2008 che viene utilizzato dalla nostra principale app Web MVC3/.Net4. Abbiamo circa 200 utenti simultanei in qualsiasi momento. Il server viene colpito in modo ESTREMAMENTE rigido (blocchi, timeout, lentezza generale) e sto cercando di applicare le cose che ho imparato durante la mia carriera e alla mia ultima certificazione MS. Sono cose su cui siamo stati addestrati ("chiudi connessioni SQL STAT") e sto cercando di spiegare alla mia squadra che queste "piccole cose", anche se non sono le uniche a fare la differenza, alla fine si aggiunge
ho bisogno di sapere se la seguente hanno un impatto sulle prestazioni o se è solo 'best practice'
1. Utilizzando "USO" parola chiave la maggior parte del loro codice è simile a questo:.
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
Mentre sto cercando di dire loro che USING chiude/libera più velocemente le risorse:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
Il loro argomento è che il GC fa un buon lavoro di pulizia dopo che il codice è stato eseguito, quindi USING non ha un impatto enorme. Vero o falso e perché?
2. Pool di connessione
ho sempre sentito la creazione di pool di connessioni in grado di accelerare in modo significativo qualsiasi sito web (almeno .Net w/MSSQL). ho raccomandato aggiungiamo quanto segue per i nostri connectionStrings nel web.config:
... "Pooling = true; Min Pool Size = 3; Max Pool Size = 100; Connessione Timeout = 10;". ..
L'argomento è che .Net/MSSQL già imposta i pool di connessione dietro le quinte e non è necessario inserirli nel nostro web.config. Vero o falso? Perché ogni altro sito afferma che il pooling deve essere aggiunto per prestazioni ottimali se è già configurato?
3. Minimizzare # di chiamate al db
il provider di ruoli/appartenenza che viene fornito con il default del progetto .Net MVC è bello - è a portata di mano e fa la maggior parte del lavoro sporco per voi. Ma questi ragazzi stanno facendo un uso serio di UsersInRoles()
e lo usano liberamente come una variabile globale (colpisce il DB ogni volta che viene chiamato questo metodo). Ho creato un "oggetto utente" che carica tutti i ruoli in anticipo su ogni pageload (insieme ad altri elementi utente, come GUID, ecc.) E quindi interrogare questo oggetto per se l'utente ha il ruolo.
Altre parti del sito Web hanno istruzioni FOR che eseguono il looping oltre 200 volte e fanno query di 20-30 sql su ogni pass = oltre 4.000 chiamate al database. In qualche modo lo fa in pochi secondi, ma quello che voglio fare è consolidare le chiamate da 20-30 DB in una, in modo che faccia una chiamata 200 volte (ogni ciclo). Ma poiché SQL Profiler dice che la query ha richiesto "0 secondi", l'argomento è che è così veloce e piccolo che i server possono gestire questo numero elevato di query DB.
Il mio pensiero è "sì, queste query sono in esecuzione veloce, ma stanno uccidendo le prestazioni generali del server SQL." Questo potrebbe essere un fattore che contribuisce? Sono preoccupato di nulla, o questo è un fattore (significativo) che contribuisce ai problemi di prestazioni generali del server?
4. Altre ottimizzazioni del codice
il primo che viene in mente è con StringBuilder
vs una variabile stringa semplice. Capisco perché dovrei usare StringBuilder
(specialmente nei loop), ma dicono che non importa - anche se hanno bisogno di scrivere linee 10k +, il loro argomento è che il guadagno di prestazioni non ha importanza.
Quindi, tutto sommato, sono tutte le cose che apprendiamo e ci hanno perforato ("riduci al minimo le possibilità!") Solo "best practice" senza guadagni di prestazioni reali o contribuiscono a un rendimento reale/misurabile perdita?
EDIT *** Grazie ragazzi per tutte le vostre risposte! Ho una nuova (quinta) domanda basata sulle tue risposte: In effetti non usano "USING", quindi cosa significa che sta succedendo? Se c'è un pool di connessioni che avviene automaticamente, sta vincolando le connessioni dal pool fino a quando il GC non arriva? È possibile che ogni connessione aperta al server SQL stia aggiungendo un po 'più di peso al server e rallentandolo?
Sulla base dei vostri suggerimenti, ho intenzione di fare un serio benchmarking/registrazione dei tempi di connessione perché ho il sospetto che a) il server sia lento, b) non stanno chiudendo le connessioni e c) Profiler sta dicendo che è in esecuzione 0 secondi, la lentezza potrebbe provenire dalla connessione.
Apprezzo molto il vostro aiuto ragazzi. Grazie ancora
Per non dire che la ricerca non è importante, ma i guru di SO forniscono un sacco di informazioni ... studiare quello che dicono è molto ricerca –
@ JakeWilson801 La documentazione da MS non è sempre la migliore fonte. (Modifica: o anche una buona fonte) –
Riusando il generatore di stringhe invece di concatenare le stringhe - se si concatenano le stringhe una volta (cioè 'var s =" a "+" b "'), allora una stringa sarà più efficiente, cosa è necessario ricordare che l'istanza di una stringa non è mutabile, quindi in un ciclo es 'string s =" a "; for (int i = 1, i <1000; i ++) {s + = "a";} 'crei una nuova istanza di stringa per ogni ciclo, questo avrà un impatto sull'allocazione della memoria e influenzerà le prestazioni complessive (che sia significativo o no dipenderà dal numero di concatenazioni). – GarethD