sql >> Database >  >> RDS >> Sqlserver

Er treedt een time-out op bij de query wanneer deze wordt uitgevoerd vanaf het web, maar supersnel wanneer deze wordt uitgevoerd vanaf SSMS

Dus uw C#-code stuurt een ad-hoc SQL-query naar SQL Server, met welke methode? Heeft u overwogen om een ​​opgeslagen procedure te gebruiken? Dat zou waarschijnlijk zorgen voor dezelfde prestaties (althans in de motor), ongeacht wie het noemde.

Waarom? De ARITHABORT-instelling is een van de dingen waar de optimizer naar kijkt wanneer deze bepaalt hoe uw query moet worden uitgevoerd (meer specifiek voor het afstemmen van plannen). Het is mogelijk dat het plan in de cache dezelfde instelling heeft als SSMS, dus het gebruikt het in de cache opgeslagen plan, maar met de tegenovergestelde instelling dwingt uw C#-code een hercompilatie af (of misschien bereikt u een echt SLECHT plan in de cache), wat in veel gevallen zeker de prestaties kan schaden.

Als je al een opgeslagen procedure aanroept (je hebt je zoekopdracht niet gepost, hoewel ik denk dat je dat wel wilde), kun je proberen OPTION (RECOMPILE) toe te voegen aan de gewraakte zoekopdracht (of zoekopdrachten) in de opgeslagen procedure. Dit betekent dat die uitspraken altijd opnieuw worden gecompileerd, maar het kan het gebruik van het slechte plan dat je lijkt te raken, voorkomen. Een andere optie is ervoor te zorgen dat wanneer de opgeslagen procedure wordt gecompileerd, de batch wordt uitgevoerd met SET ARITHABORT ON.

Ten slotte lijkt u zich af te vragen hoe u de ARITHABORT-instelling in SSMS kunt wijzigen. Ik denk dat je wilde vragen hoe je de ARITHABORT-instelling in je code kunt forceren. Als u besluit door te gaan met het verzenden van ad-hoc SQL vanuit uw C#-app, kunt u natuurlijk een opdracht als tekst verzenden met meerdere instructies gescheiden door puntkomma's, bijvoorbeeld:

SET ARITHABORT ON; SELECT ...

Zie het geweldige artikel van Erland Sommarskog voor meer informatie over waarom dit probleem optreedt:

  • Traag in de applicatie, snel in SSMS? Prestatiemysteries begrijpen


  1. Kan tekenreekswaarde 1,2 niet doorgeven als invoer voor een orakel-query

  2. PostgreSQL-array met elementen die elk een externe sleutel zijn

  3. Belang van transactielogboek in SQL Server

  4. Converteer 'datetimeoffset' naar 'smalldatetime' in SQL Server (T-SQL-voorbeelden)