Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

La query scade se eseguita dal Web, ma super veloce se eseguita da SSMS

Quindi il tuo codice C# sta inviando una query SQL ad hoc a SQL Server, usando quale metodo? Hai considerato l'utilizzo di una stored procedure? Ciò probabilmente garantirebbe le stesse prestazioni (almeno nel motore) indipendentemente da chi l'ha chiamato.

Come mai? L'impostazione ARITHABORT è una delle cose che l'ottimizzatore esamina quando determina come eseguire la query (più specificamente, per la corrispondenza del piano). È possibile che il piano nella cache abbia la stessa impostazione di SSMS, quindi utilizza il piano memorizzato nella cache, ma con l'impostazione opposta il tuo codice C# sta forzando una ricompilazione (o forse stai colpendo un davvero BAD piano nella cache), il che può sicuramente compromettere le prestazioni in molti casi.

Se stai già chiamando una stored procedure (non hai pubblicato la tua query, anche se penso che volevi farlo), puoi provare ad aggiungere OPTION (RICIMPILA) alla query (o alle query) incriminate nella stored procedure. Ciò significherà che quelle affermazioni verranno sempre ricompilate, ma potrebbe impedire l'uso del cattivo piano che sembra che tu stia colpendo. Un'altra opzione è assicurarsi che quando la procedura memorizzata viene compilata, il batch venga eseguito con SET ARITHABORT ON.

Infine, sembra che tu stia chiedendo come modificare l'impostazione ARITHABORT in SSMS. Penso che quello che intendevi chiedere è come puoi forzare l'impostazione ARITHABORT nel tuo codice. Se decidi di continuare a inviare SQL ad hoc dalla tua app C#, ovviamente puoi inviare un comando come testo con più istruzioni separate da punto e virgola, ad esempio:

SET ARITHABORT ON; SELECT ...

Per ulteriori informazioni sul motivo per cui si verifica questo problema, vedere l'ottimo articolo di Erland Sommarskog:

  • Lento nell'applicazione, veloce negli SSMS? Comprendere i misteri delle prestazioni