sql >> Databasteknik >  >> RDS >> Sqlserver

Frågan tar timeout när den körs från webben, men supersnabb när den körs från SSMS

Så din C#-kod skickar en ad hoc SQL-fråga till SQL Server, med vilken metod? Har du övervägt att använda en lagrad procedur? Det skulle förmodligen garantera samma prestanda (åtminstone i motorn) oavsett vem som kallade det.

Varför? ARITHABORT-inställningen är en av de saker som optimeraren tittar på när den avgör hur din fråga ska köras (mer specifikt för planmatchning). Det är möjligt att planen i cachen har samma inställning som SSMS, så den använder den cachade planen, men med den motsatta inställningen tvingar din C#-kod fram en omkompilering (eller kanske du träffar en riktigt BAD plan i cachen), vilket säkert kan skada prestandan i många fall.

Om du redan anropar en lagrad procedur (du postade inte din fråga, även om jag tror att du menade det), kan du försöka lägga till OPTION (RECOMPILE) till den stötande frågan (eller frågorna) i den lagrade proceduren. Detta kommer att innebära att dessa uttalanden alltid kommer att kompileras om, men det kan förhindra användningen av den dåliga planen du verkar ha. Ett annat alternativ är att se till att när den lagrade proceduren kompileras exekveras batchen med SET ARITHABORT PÅ.

Slutligen verkar du fråga hur du kan ändra ARITHABORT-inställningen i SSMS. Jag tror att det du menade att fråga är hur du kan tvinga ARITHABORT-inställningen i din kod. Om du bestämmer dig för att fortsätta skicka ad hoc SQL från din C#-app kan du naturligtvis skicka ett kommando som text som har flera satser separerade med semikolon, t.ex.:

SET ARITHABORT ON; SELECT ...

För mer info om varför det här problemet uppstår, se Erland Sommarskogs stora artikel:

  • Långsam i applikationen, snabb i SSMS? Förstå prestandamysterier


  1. Varför kan jag inte utesluta beroende kolumner från `GROUP BY` när jag aggregerar med en nyckel?

  2. SQL för att hitta det första icke-numeriska tecknet i en sträng

  3. Postgres:Hur gör man Composite keys?

  4. Vad är fördelen med zerofill i MySQL?