sql >> Databáze >  >> RDS >> Sqlserver

Časový limit dotazu vyprší při spuštění z webu, ale superrychlý při spuštění z SSMS

Takže váš kód C# posílá ad hoc SQL dotaz na SQL Server, pomocí jaké metody? Uvažovali jste o použití uložené procedury? To by pravděpodobně zajistilo stejný výkon (alespoň v motoru) bez ohledu na to, kdo to volal.

Proč? Nastavení ARITHABORT je jednou z věcí, na kterou se optimalizátor dívá, když určuje, jak provést váš dotaz (konkrétněji pro párování plánu). Je možné, že plán v mezipaměti má stejné nastavení jako SSMS, takže používá plán uložený v mezipaměti, ale s opačným nastavením váš kód C# vynucuje rekompilaci (nebo možná narážíte na opravdu ŠPATNÝ plán v mezipaměti), což jistě může v mnoha případech poškodit výkon.

Pokud již voláte uloženou proceduru (nezaslali jste dotaz, i když si myslím, že jste to chtěli), můžete zkusit přidat OPTION (RECOMPILE) do problematického dotazu (nebo dotazů) v uložené proceduře. To bude znamenat, že tyto příkazy budou vždy znovu zkompilovány, ale mohlo by to zabránit použití špatného plánu, který se zdá být hitem. Další možností je zajistit, aby při kompilaci uložené procedury byla dávka provedena s SET ARITHABORT ON.

Nakonec se zdá, že se ptáte, jak můžete změnit nastavení ARITHABORT v SSMS. Myslím, že jste se chtěl zeptat, jak můžete vynutit nastavení ARITHABORT ve vašem kódu. Pokud se rozhodnete pokračovat v odesílání ad hoc SQL z vaší aplikace C#, pak samozřejmě můžete odeslat příkaz jako text, který má více příkazů oddělených středníkem, např.:

SET ARITHABORT ON; SELECT ...

Další informace o tom, proč k tomuto problému dochází, najdete ve skvělém článku Erlanda Sommarskoga:

  • Pomalá aplikace, rychlá SSMS? Porozumění záhadám výkonu


  1. Proč nemohu v příkazu DELETE použít alias?

  2. Jak používat PHP pro připojení k serveru SQL

  3. MySql:MyISAM vs. Inno DB!

  4. Jak opravit dvojitě zakódované znaky UTF8 (v tabulce utf-8)