Domanda

Ho un'applicazione Web in cui il database Web Server e SQL Server 2008 si siedono su scatole diverse nella stessa azienda server.

Se prendo una procedura memorizzata monolitica e interrompo diversi Procs memorizzati più piccoli, rendendo così il codice cliente responsabile delle chiamate a più procedure memorizzate anziché solo una, e avrei una prestazione significativa colpita My Web Application?


.

Informazioni di base aggiuntive:

Ho una procedura memorizzata con diverse centinaia di righe di codice contenente logica decisionale, dichiarazioni di aggiornamento e infine un'istruzione Seleziona che restituisce una serie di dati al client.

Ho bisogno di inserire un pezzo di funzionalità nel mio codice client (in questo senso, il codice client è il server Web ASP che chiamano il server del database) che chiama un DLL del componente. Tuttavia, la procedura memorizzata sta aggiornando un recordset e restituire i dati UDPated nella stessa chiamata e il mio codice deve idealmente essere chiamato dopo vengono chiamati le dichiarazioni di logica decisionale e aggiornamento, ma prima < / EM> I dati vengono restituiti al client.

Per far funzionare questa funzionalità, probabilmente dovrò dividere il Procen memorizzato esistente in almeno due parti: uno memorizzato Proc che aggiorna il database e un altro che recupera i dati dal database. Vorrei quindi inserire il mio nuovo codice tra queste chiamate PROC memorizzate.

Quando guardo questo problema, non posso fare a meno di pensare che, da un punto di vista di manutenzione del codice, sarebbe molto meglio isolare tutto del mio aggiornamento e selezionare le istruzioni in sottile memorizzato Procs e lascia la logica aziendale al codice cliente. In questo modo ogni volta che ho bisogno di inserire funzionalità o logica decisionale nel mio codice cliente, tutto ciò che devo fare è cambiare il codice cliente anziché modificare un enorme proc.

Sebbene l'utilizzo di PROC stored sottile potrebbe essere migliore da un punto di manutenzione del codice, quanta prestazione analizzerò il dolore per le prestazioni aumentando il numero di viaggi al database? Il risultato netto ai dati è lo stesso, ma sto toccando il database più frequentemente. In che modo questo approccio influisce sulle prestazioni quando l'applicazione viene ridimensionata per gestire la domanda?

Non sono uno per posizionare l'ottimizzazione delle prestazioni sopra tutto il resto, specialmente quando influisce sulla manutenzione del codice, ma non voglio spararmi nel piede e creare mal di testa quando l'applicazione Web deve scalare.

È stato utile?

Soluzione

In generale, come regola del pollice dovresti creare andata e ritorno a SQL Server al minimo.

Il "Hit" sul server è molto costoso, in realtà è più costoso per devidere la stessa operazione in 3 parti quindi facendo 1 colpo e tutto il resto sul server.

Per quanto riguarda la manutenzione, è possibile chiamare 1 Proc di memorizzato dal cliente, avendo il PROC chiamando altri 2 proc.

Ho avuto un'applicazione con la logica di ricerca estrema, questo è quello che ho fatto per implementarlo.

Alcuni risultati di benchmarking ... Ho avuto un cliente un po 'di tempo che aveva i server che cadevano e si sgretolano, quando abbiamo controllato il problema, sono stati molti antaillip a SQL Server, quando ci minimizziamo, i server sono tornati alla normalità.

Altri suggerimenti

Ci influenzerà.Utilizziamo un server weblogic in cui tutta la logica aziendale si trova nell'appserver collegato a un database DB / 2.Utilizziamo principalmente i fagioli di entità nel nostro progetto e per la maggior parte delle chiamate di servizi aziendali fanno diversi viaggi al DB senza effetti collaterali visibili.(Sintonizziamo alcune query per essere multi-tabella quando necessario).

Dipende davvero dalla tua app.Avrai bisogno di benchmark.

Un server SQL di Ben impostazione su un buon hardware può elaborare molte migliaia di transazioni al secondo.

In effetti, la rottura di una grande procedura memorizzata può essere utile, poiché è possibile avere solo un piano di query memorizzato nella cache per batch.Rompere in diversi lotti significa che riceveranno ciascuno il proprio piano di query.

Dovresti definitivamente sbagliare sul lato della manutenzione del codice, ma il benchmark per essere sicuro.

Dato che il panorama del piano di query verrà ricado, dovresti essere preparato per aggiornare i tuoi indici, forse creando diversi indici di copertura.

In sostanza, questa domanda è strettamente correlata a stretto contro l'accoppiamento allentato.

All'inizio: è possibile utilizzare sempre la procedura memorizzata monolitica e interromperla in diversi Procs memorizzati più piccoli, che sono tutti chiamati da una stored procedure , rendendo così il codice cliente solo responsabile della chiamatauna procedura memorizzata.

A meno che il client non farà qualcosa (modificare i dati o fornire lo stato all'utente) che probabilmente non consiglierei di spostare più chiamate al client, poiché si potrebbe accoppiare più strettamente il client all'ordine delle operazioni per la procedura memorizzata senzaUn aumento significativo performance.

In entrambi i casi, vorrei il punto di riferimento e si regola da lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top