Така че вашият C# код изпраща ad hoc SQL заявка към SQL Server, използвайки какъв метод? Мислили ли сте да използвате съхранена процедура? Това вероятно би осигурило същата производителност (поне в двигателя), независимо кой го е извикал.
Защо? Настройката ARITHABORT е едно от нещата, които оптимизаторът разглежда, когато определя как да изпълни вашата заявка (по-конкретно за съвпадение на план). Възможно е планът в кеша да има същата настройка като SSMS, така че да използва кеширания план, но с обратната настройка вашият C# код принуждава прекомпилиране (или може би удряте наистина ЛОШО план в кеша), което със сигурност може да навреди на производителността в много случаи.
Ако вече извиквате съхранена процедура (не сте публикували заявката си, въпреки че мисля, че сте имали предвид), можете да опитате да добавите OPTION (RECOMPILE) към нарушителната заявка (или заявки) в съхранената процедура. Това ще означава, че тези оператори винаги ще се прекомпилират, но това може да предотврати използването на лошия план, който изглежда удряте. Друга възможност е да се уверите, че когато съхранената процедура се компилира, партидата се изпълнява с SET ARITHABORT ON.
И накрая, изглежда, че питате как можете да промените настройката на ARITHABORT в SSMS. Мисля, че това, което искахте да попитате, е как можете да наложите настройката ARITHABORT във вашия код. Ако решите да продължите да изпращате ad hoc SQL от вашето C# приложение, тогава, разбира се, можете да изпратите команда като текст, който има множество изрази, разделени с точка и запетая, напр.:
SET ARITHABORT ON; SELECT ...
За повече информация защо възниква този проблем, вижте страхотната статия на Erland Sommarskog:
- Бавно в приложението, бързо в SSMS? Разбиране на мистериите на изпълнението