Я бы сказал, что это почти наверняка сниффинг параметров.
Часто утверждается, что это SET OPTIONS
может повлиять на производительность таким образом, но я еще не видел ни одного официального источника для этого утверждения, за исключением случая, когда вы используете индексированные представления / постоянные вычисляемые столбцы.
В этом случае (для SQL2005 + и если ваша база данных не находится в режиме совместимости с SQL2000 ). Если у вас есть ARITHABORT
и ANSI_WARNINGS
OFF
то, и другое, вы обнаружите, что индекс не используется, поэтому может иметь место сканирование, а не желаемый поиск (и некоторые накладные расходы, поскольку постоянный результат вычисления не может быть использован). ADO.NET, кажется, по умолчанию имеет ANSI_WARNINGS ON
быстрый тест, который я только что сделал.
Утверждение в ответе Бена о том, что «способ, которым сервер выполняет численные вычисления», может прибавить минуты к результату, который в противном случае занял бы менее секунды, просто не кажется мне заслуживающим доверия. Я думаю, что, как правило, происходит то, что при исследовании проблемы производительности производительности Profiler используется для идентификации ошибочного запроса. Он вставляется в управляющую студию и запускается и мгновенно возвращает результаты. Единственная очевидная разница между соединениями - это ARITH_ABORT
опция.
Быстрый тест в окне Management Studio показывает, что при SET ARITHABORT OFF
включении и выполнении запроса возникает проблема с производительностью, которая, по-видимому, закрыта. Действительно, похоже, что это методология устранения неполадок, используемая в ссылке Грегга Старка .
Однако это игнорирует тот факт, что с этим параметром вы можете получить точно такой же плохой план из кэша .
Такое повторное использование плана может произойти даже в том случае, если вы вошли в систему как другой пользователь, нежели использует подключение к приложению.
Я проверил это, выполнив сначала тестовый запрос из веб-приложения, а затем из Management Studio с, SET ARITHABORT OFF
и увидел, что количество пользователей возрастает из приведенного ниже запроса.
SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Чтобы это совместное использование могло произойти, все ключи кэша планов должны быть одинаковыми. Как и arithabort
некоторые другие примеры, исполняющим пользователям нужна такая же схема по умолчанию (если запрос основан на неявном разрешении имен), а соединениям нужен тот же language
набор.
Более полный список ключей кэша плана здесь