Я полностью понимаю, что SQL-запросы от приложений обычно используют SET ARITHBAORT OFF
, где SSMS (по умолчанию) использует SET ARITHBAORT ON
. Я также считаю, что SET ARITHBAORT OFF
существует только для совместимости с оригиналом, и действительно запросы должны выполняться с SET ARITHBAORT ON
.ARITHABORT OFF отрицательно влияет на производительность
У меня есть запрос, который выполняется как часть командного файла приложения консоли C#. Контекст подготовлен (по умолчанию) с SET ARITHBAORT OFF
и SET ANSI_WARNINGS ON
. Первые 92 вызова выполняются отлично, и 93-й всегда блокируется (каждый вызов использует разные параметры). Я смог воспроизвести это в SSMS, если я использую SET ARITHBAORT OFF
до вызова хранимой процедуры с параметрами 93-го вызова.
Так что на мой вопрос (извините за справочную информацию до сих пор) .... В Erland Sommarskog article состояний:
Далее, когда дело доходит до ARITHABORT, вы должны знать, что в SQL 2005 и позже версии, этот параметр имеет нулевой эффект, если ANSI_WARNINGS включен. Таким образом, нет оснований для его включения ради этого.
Однако, я использую SQL Server 2014, и я считаю, что:
SET ARITHBAORT ON
SET ANSI_WARNINGS ON
EXEC mySP -- Runs efficiently
работает нормально, но
SET ARITHBAORT OFF
SET ANSI_WARNINGS ON
EXEC mySP -- Runs indefinitely
бессрочно. Поэтому, если SET ANSI_WARNINGS ON
делает параметр ARITHBAORT
нерелевантным, почему мой запрос блокируется? Спасибо.
http://www.sommarskog.se/query-plan-mysteries.html
Я не уверен, что следую вашей линии рассуждений, поскольку в вашем последнем примере вы, похоже, также * устанавливаете 'ANSI_WARNINGS'' OFF', поэтому какие эффекты он имеет, когда он включен, не имеют значения. –
К сожалению, это была опечатка. Я исправлю это, я поддерживаю 'SET ANSI_WARNINGS ON' в обоих случаях. –
OK. Я только что обнаружил другую скрытую переменную, которая повлияла на мой запрос. Хотя я использую SQL Server 2014, база данных находилась в режиме совместимости с SQL Server 2008 (100) (согласно нашей базе данных). Когда я переключу его на «SQL Server 2014 (120)», оба запроса теперь выполняются в том же порядке времени. Так может ли утверждение в статье также быть обусловлено уровнем совместимости ПОСЛЕ SQL Server 2005? –