2013-10-17 9 views
5

Ho un'applicazione ASP .NET 4.5. In una pagina di manutenzione è una casella di testo che consente agli utenti amministrativi di scrivere SQL che viene eseguito direttamente sul database di SQL Server 2008.Come impedire alle query SQL inefficienti di rallentare un server di database

Occasionalmente uno degli utenti amministrativi scrive SQL inefficiente e il processo di SQL Server inizia a utilizzare tutta la memoria e i cicli della CPU sul server. Dovremo quindi avviare e interrompere il servizio per ottenere nuovamente il server di risposta.

C'è un modo in cui posso fermarli da query che consumano tutte le risorse? Queste query non torneranno abbastanza velocemente da consentire all'utente di vederle, quindi è possibile cancellare la query.

Edit mi rendo conto che sarebbe stato meglio per impedire agli utenti di scrivere query SQL, ma purtroppo non è possibile rimuovere questa funzionalità dall'applicazione. Gli utenti amministratori non vogliono essere educati.

+0

Se si dispone del [grado massimo di parallelismo] (http://technet.microsoft.com/en-us/library/ms189094.aspx) impostato su illimitato (o su più di 1) è possibile eseguire tutte le query 'MAXDOP 1' per impedire loro di mangiare tutti i core. – DaveShaw

+0

Detto questo, non conosco un modo tecnico, a parte il limitato CommandTimeout sulla connessione, o il monitoraggio e l'educazione di chi causa questi problemi. – DaveShaw

+0

Supponendo di avere una configurazione di produzione/gestione temporanea, fare in modo che l'amministratore verifichi prima le query sulla gestione temporanea in modo che una macchina importante non sia vincolata. Anche se uccidi la query dopo un limite di tempo, nel frattempo potresti impegnare risorse importanti (non buone in produzione). –

risposta

6

È possibile impostare il governatore di query a livello di server ma non si è sicuri di un limite per utente o per connessione/applicazione.

http://technet.microsoft.com/en-us/magazine/dd421653.aspx

Detto questo, è probabile che un povero pratica/pericolosa per consentire agli utenti di inserire direttamente le query SQL.

+0

Grazie, l'aggiunta di "set query_governor_cost_limit 600" all'inizio di qualsiasi SQL inserito sembra aver bloccato qualsiasi cosa troppo selvaggia dall'esecuzione senza sconvolgere troppo gli utenti. – user1069816

3

Prima di tutto, mi assicuravo che queste query non bloccassero nessuna tabella (utilizzare NOLOCK o SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED per ogni query eseguita).

Per quanto riguarda le risorse, vorrei esaminare qualcosa come il Resource Governor. Lo usiamo per eventuali report ad hoc sul nostro sistema OLTP di produzione.

Pinal Dave ha un bel post sul blog. Puoi anche consultare Technet o altri siti MS per informazioni su cosa sia e come configurarlo.

http://blog.sqlauthority.com/2012/06/04/sql-server-simple-example-to-configure-resource-governor-introduction-to-resource-governor/

1
  1. Creare un utente che avrà non più e non meno privilegi del necessario.

  2. Creare alcuni dati di accesso per l'utente, non lo condividerai con gli amministratori che scriveranno le query.

  3. Creare un pannello/pagina/applicazione in cui si consente loro di scrivere le loro domande. Qui è possibile aggiungere ulteriori vincoli non disponibili a livello di sistema RDBMS.

Si consente agli utenti di accedere a questo pannello/pagina/applicazione e in questo modo eseguiranno le loro query. Se stanno facendo qualcosa di indesiderato scoperto da te, devi solo emettere le tue modifiche per il privilegio e il pannello/pagina/applicazione.

0

Il modo migliore per impedire a SQL di utilizzare memoria/CPU: non consentire agli utenti di eseguire query.

Si suppone che SQL Server utilizzi tutta la memoria su cui può essere inserito, quindi l'utilizzo della memoria (o l'utilizzo della CPU per quella materia) non sarebbe il motivo per riavviare SQL.

Per impostazione predefinita, il timeout di SQL SqlCommand è di 30 secondi. Quando scade, la query verrà annullata.Le query possono richiedere un po 'di tempo per essere annullate, specialmente se si eseguivano modifiche dei dati e si dovevano verificare dei rollback. È possibile che mentre la query è in esecuzione/annullando altre query utente vengano bloccate. Ciò potrebbe far sembrare che SQL Server non risponda, ma alla fine finirà e l'utilizzo della CPU tornerà alla normalità. Tuttavia, la memoria continuerà ad essere utilizzata dal processo di SQL Server.

0

Lasciando da parte i pro/contro di consentire agli utenti di creare ed eseguire le proprie query, una soluzione potrebbe essere quella di utilizzare Resource Governor fornito con SQL 2008/2012. Penso che sia disponibile solo nelle edizioni Enterprise, il che potrebbe significare che non puoi usarlo (non hai specificato un'edizione nella tua domanda).

Technet ha un articolo su come gestire i carichi di lavoro, ma in pratica è possibile limitare una sessione (in base ai dettagli di accesso o qualsiasi altra informazione decrescente) per utilizzare solo una certa% di CPU e/o memoria.

Problemi correlati