Come tracciare le query SQL che stanno bloccando SQL Server


9

Abbiamo un server di database SQL Server 2008 (sembra essere in esecuzione in MS Failover Clustering, ma non credo che sia rilevante qui).

La nostra applicazione esegue Hibernate per l'accesso al DB e da quando abbiamo aggiornato di recente dalla v3.1 alla 3.6, abbiamo riscontrato un arresto anomalo regolare di SQL Server (ogni 24-48 ore, ma a volte più frequentemente).

Il problema specifico in questione sembra essere legato alla memoria. Poco prima che il server si arresti in modo anomalo (e quindi viene riavviato automaticamente dal gestore cluster di failover), otteniamo un carico di questi errori:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

anche messaggi occasionali (ma regolari) di

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Errore: 17312, gravità: 16, stato: 1. (Params :). L'errore viene stampato in modalità concisa perché si è verificato un errore durante la formattazione. Traccia, ETW, notifiche ecc. Vengono saltati.

Ricevo anche alcuni errori a livello di app come

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

e poi l'errore emozionante e forse istruttivo:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Il carico sul server non è cambiato, quindi non c'è motivo per cui ora dovrebbe rimanere senza memoria quando in precedenza non indicava un problema con le query che gli venivano inviate.

Ora alla domanda: come posso rintracciare le query che causano questo errore (e quindi presumibilmente tutti i problemi)? Sembra che dal nostro aggiornamento di Hibernate, abbia lanciato alcune enormi query su SQL Server, e questo è rotto. In effetti, ho alcune idee su cosa potrebbero essere, ma sarebbe bello poterle rintracciare.

Ovviamente posso eseguire il profiler di SQL Server, ma una volta fatto (e prodotto un'enorme quantità di dati - è un database OLTP occupato), come posso filtrare per trovare le query problematiche?

Grazie!


1
Tutto funziona sullo stesso server? Significato, il server delle applicazioni, con Java, è anche in esecuzione sul server di database?
swasheck

1
In associazione con la domanda di @ swasheck: hai impostato un valore esplicito per la memoria massima di SQL Server? Hai escluso la pressione della memoria esterna?
Mike Fal,

Hai provato a guardare le tracce della scatola nera? Potrebbero indicarti la giusta direzione.
datagod

Ho appena colpito questa cosa e le tracce che ho lasciato in esecuzione mostrano un database inattivo dal punto di vista dell'applicazione.
Giosuè,

Usi qualche ricerca full text? Inoltre, qual è l'esatta build no + edition del server sql su cui stai eseguendo?
Kin Shah,

Risposte:


5

Seguire i passaggi descritti in Come utilizzare il DBCC MEMORYSTATUScomando per monitorare l'utilizzo della memoria su SQL Server . L'azione correttiva dipenderà dai risultati. Puoi anche leggere Come identificare i colli di bottiglia della memoria di Microsoft SQL Server che sono più accessibili.

Un avvertimento però: è improbabile che tu possa incolpare di singole domande. Rintracciare i problemi di memoria è più sottile di così. Tieni presente che quando stai esaurendo le risorse e una query genera un errore di memoria insufficiente, è possibile che la query che genera l'errore sia solo la vittima , non il colpevole.


Grazie - Ho già esaminato quelli, ma il problema è che il server sembra funzionare bene e poi all'improvviso scoppia, non esaurisce gradualmente la memoria. Inoltre, non è chiaro da nulla che riesca a trovare online quale sia l'errore "Memoria di sistema insufficiente nel pool di risorse" interna "per eseguire questa query." in realtà significa: qual è il pool di risorse interno per quanto riguarda i risultati di DBCC MEMORYSTATUS?

È un server di sviluppo? In tal caso, è possibile eseguire il downgrade a Hibernate 3.1 per verificare che il problema scompaia? Hai due linee di indagine iniziali e devi provare a eliminarne una, SQL Server ha i limiti di memoria impostati e li sta superando o qualche altra parte del sistema sta consumando memoria e SQL Server viene compresso. Profilare il sistema in base ai tempi dell'incidente per determinare quale sta accadendo.
epo

0

Sembra che tu voglia andare per la Extended Eventsconfigurazione usando gli eventi query_memory_grant_xxxxx.

Questa è l'opzione migliore per registrare le informazioni e archiviare il motore SQL fuori misura che puoi leggere in qualsiasi momento (puoi anche guardare i dati in tempo reale), le informazioni memorizzate non verrebbero cancellate quando il riavvio del server si verifica diversamente DMVs

Passaggi di installazione rapida ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.