Итак, я решил, что ошибочное поведение моего SQL Server связано с настройкой по умолчанию поставщика данных .Net SqlClient SET ARITHABORT OFF
. С учетом сказанного я прочитал различные статьи, в которых обсуждается лучший способ реализации этого. Для меня я просто хочу простой способ, потому что SQL Server страдает, и моя настройка запросов не полностью перешагнула через приложение (и очевидно, что добавление SET
в sp НЕ РАБОТАЕТ).
В блестящей статье Эрланда Соммарскога на эту тему он в основном предлагает использовать безопасный подход, изменив приложение для выдачи SET ARITHABORT ON
соединения. Однако в этом ответе на вопрос dba.stackexchange Соломон Рутцки предлагает подход как на уровне экземпляра, так и на уровне базы данных.
Какие последствия я здесь упускаю при настройке этого экземпляра? На мой взгляд ... поскольку SSMS имеет этот набор ON
по умолчанию, я не вижу вреда в настройке этого параметра ON
для всего сервера для всех подключений. В конце концов, мне просто нужен этот SQL Server, чтобы работать выше всего остального.
источник
ARITHABORT OFF
, то нормально. Не включайте его для всех входящих подключений. (Удачи, контролирующего это). Но когда соединение приходит с установленным значением ON, SQL генерирует новый план Query, и это может повлиять на производительность. Мой вариант, установите его в качестве пользовательской опции по умолчанию на уровне экземпляра и соответственно настройте запросы.Ответы:
Есть некоторые значения по умолчанию, которые существуют только потому, что никто не знает, каков будет результат их изменения. Например, сопоставление по умолчанию на уровне экземпляра при установке в системе, в которой в качестве языка операционной системы используется «американский английский»
SQL_Latin1_General_CP1_CI_AS
. Это не имеет смысла, поскольку параметрыSQL_*
сортировки предназначены для совместимости до SQL Server 2000. Начиная с SQL Server 2000, вы на самом деле можете выбирать параметры сортировки Windows, поэтому значение по умолчанию для систем на английском языке США должно быть изменено наLatin1_General_CI_AS
. НО, я думаю, никто в Microsoft не знает, как это повлияет на все возможные подсистемы, системные хранимые процедуры и т. Д.Таким образом, я не знаю о каком-либо конкретном негативном влиянии установки его в значение ON как базы данных по умолчанию или даже для всего экземпляра. В то же время я не проверял это. Но даже если бы я его протестировал, я бы все равно не использовал те же пути кода, что и ваше приложение, так что это то, что вам действительно нужно протестировать в вашей среде. Установите это
ON
на уровне экземпляра в ваших средах разработки и тестирования и посмотрите, как это работает в течение месяца или двух. Затем включите его в Staging / UAT. Если в течение нескольких недель все идет хорошо, измените конфигурацию на «Производство». Ключ должен дать как можно больше времени для тестирования различных путей кода, которые не используются ежедневно. Некоторые поражаются еженедельно или месяцами или ежегодно. Некоторые пути кода затрагиваются только поддержкой, или каким-то специальным отчетом или процедурой поддержки, о которых кто-то создал много лет назад и о которой вам никогда не говорили, а используется только через случайные промежутки времени (нет, этого никогда не бывает ;-).Итак, я провел некоторое тестирование на экземпляре, который все еще имеет настройку «пользовательских параметров» по умолчанию, поскольку я никогда не менял ее.
Пожалуйста, обратите внимание:
@@OPTIONS
/'user options'
является битовой маскойARITHABORT ON
НАСТРОИТЬ
Я тестировал как SQLCMD (который использует ODBC), так и LINQPad (который использует .NET SqlClient):
(это
^
символ продолжения строки DOS;.
последняя строка просто заставляет дополнительную строку облегчать копирование и вставку)В LINQPad:
ТЕСТ 1: До
SQLCMD возвращает:
LINQPad возвращает:
ИЗМЕНИТЬ ВАРИАНТ ПОДКЛЮЧЕНИЯ ПО УМОЛЧАНИЮ:
Следующий T-SQL включается
ARITHABORT
без удаления каких-либо других параметров, которые могут быть установлены, и без изменения чего-либо, еслиARITHABORT
оно уже установлено в значении битовой маски.ТЕСТ 2: После
SQLCMD возвращает:
LINQPad возвращает:
Заключение
Учитывая, что:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, поэтому они принимают настройку по умолчаниюЯ бы предложил изменить параметры подключения по умолчанию для всего экземпляра (как показано выше). Это было бы менее навязчиво, чем обновление приложения. Я бы обновил приложение, только если вы обнаружите проблему с изменением настроек для всего экземпляра.
PS Я провел простой тест с изменением,
tempdb
а не с изменением настроек для всего экземпляра, и, похоже, это не сработало.источник
SET ARITHABORT OFF
это не присутствует. Так зачем беспокоиться об этом? единственный случай, когда мы видели, где переопределено значение по умолчанию, это SSMS, устанавливающий егоON
(что хорошо). В любом случае я обновил свой ответ тестированием и тем, что я считаю наиболее логичной рекомендацией (согласно имеющейся информации).ARITHABORT OFF
если вы обнаружите какие-либо фактические случаи его возникновения. Пока, вероятно, нет ни одного. 3) Так как это влияет на планы запросов, может случиться так, что в таблицах никогда не было достаточно данных, чтобы у SQL Server были определенные варианты для рассмотрения, где теперь есть больше вариантов, а некоторые плохие. Или, возможно, есть другие переходные факторы, такие как устаревшая статистика и т. Д. Не совсем уверен.