SQL Server의 모든 연결에 ARITHABORT ON을 설정하면 어떤 결과가 있습니까?


10

따라서 SQL Server의 비정상적인 동작은 .Net SqlClient Data Provider의 기본 설정 인으로 결정되었습니다 SET ARITHABORT OFF. 그 말로, 나는 이것을 구현하는 가장 좋은 방법에 대해 토론하는 다양한 기사를 읽었습니다. 저에게는 SQL Server가 어려움을 겪고 쿼리 튜닝이 앱 전체에서 완전히 초월되지 않았기 때문에 쉬운 방법을 원합니다 ( SETsp가 작동하지 않습니다).

Erland Sommarskog의 주제에 대한 훌륭한 기사 에서 그는 기본적으로 SET ARITHABORT ON연결 을 위해 발행 할 앱을 변경하여 안전한 접근 방법을 제안 합니다. 그러나 dba.stackexchange 질문 에서이 답변에서 Solomon Rutzky는 인스턴스 전체 및 데이터베이스 전체 접근 방식을 모두 제공합니다.

이 인스턴스 전체를 설정하면 어떤 결과가 발생하지 않습니까? 보시다시피 ... SSMS는 ON기본적 으로이 설정 을 가지고 있기 때문에 ON모든 연결에 대해 서버 전체를 설정하는 데 아무런 해가 없습니다 . 하루가 끝나면이 SQL Server가 무엇보다 중요합니다.


질문에 링크 한 내 대답의 많은 부분을 읽으면 이제 기본적으로 꺼져있는 것으로 보입니다. 일부 클라이언트는 특히 켭니다. 그러나 EF / SqlClient는 터치하지 않으므로 OFF로 유지됩니다.
Solomon Rutzky

1
EF는 없지만 EF가 인스턴스 전체 설정을 재정의하는 방법에 대한 흥미로운 점을 제기합니다. 따라서 연결이이를 재정의 할 수있는 경우 가능하면 SQL Server에 설정된 연결 내에서이 집합을 보유 할 수있는 가장 안정적인 위치는 분명합니다.
Eric Swiggum

1
"로그온 세션에서 항상 ARITHABORT를 ON으로 설정하십시오. ARITHABORT를 OFF로 설정하면 쿼리 최적화에 부정적인 영향을 미쳐 성능 문제가 발생할 수 있습니다." Microsoft의이 기사는 다음과 같이
Shiwangini Shishulkar

다양한 시나리오를 테스트 한 결과,이 설정과 매개 변수 스니핑이 빈약 한 것입니다. 당신이 있다면, 좋아 ARITHABORT OFF. 들어오는 모든 연결에 대해 차단하십시오. (행운을 제어). 그러나 연결을 ON으로 설정 한 상태에서 연결하면 SQL이 새 쿼리 계획을 생성하므로 성능에 영향을 줄 수 있습니다. 필자의 경우 인스턴스 수준에서 기본 사용자 옵션으로 ON으로 설정하고 그에 따라 쿼리를 조정하십시오.
Eric Swiggum

답변:


11

변화의 영향이 무엇인지 아무도 모르기 때문에 존재하는 몇 가지 기본값이 있습니다. 예를 들어 OS 언어로 "US English"를 사용하는 시스템에 설치할 때 기본 인스턴스 수준 데이터 정렬은 SQL_Latin1_General_CP1_CI_AS입니다. SQL_*데이터 정렬은 SQL Server 2000 이전 버전과의 호환성을위한 것이므로 의미가 없습니다 . SQL Server 2000부터는 실제로 Windows 데이터 정렬을 선택할 수 있으므로 미국 영어 시스템의 기본값 이로 변경 되어야 합니다 Latin1_General_CI_AS. 그러나 Microsoft의 아무도 잠재적 인 다양한 하위 시스템 및 시스템 저장 프로 시저에 어떤 영향을 줄지 아무도 모른다고 생각합니다.

따라서 데이터베이스 기본값 또는 인스턴스 전체로 ON으로 설정하면 특정 부정적인 영향을 알지 못합니다. 동시에 테스트하지 않았습니다. 그러나 테스트 한 경우에도 응용 프로그램과 동일한 코드 경로를 사용하지 않을 수 있으므로 환경에서 실제로 테스트 해야하는 것입니다. 로 설정ON개발자 및 QA 환경의 인스턴스 수준에서 한두 달 동안 어떻게 작동하는지 확인하십시오. 그런 다음 스테이징 / UAT에서 활성화하십시오. 몇 주 동안 모든 것이 계속 잘 진행되면 해당 구성 변경을 프로덕션으로 롤하십시오. 핵심은 매일 적중하지 않는 다양한 코드 경로를 테스트하는 데 가능한 한 많은 시간을 제공하는 것입니다. 일부는 매주 또는 몇 달 또는 매년 타격을받습니다. 일부 코드 경로는 지원 또는 몇 년 전에 누군가가 만든 적이없는 임의의 간격으로 만 사용되는 임시 보고서 또는 유지 관리 프로세스 만 지원합니다.

따라서 변경하지 않았으므로 여전히 기본 "사용자 옵션"설정이있는 인스턴스에서 테스트를 수행했습니다.

참고 :

  • @@OPTIONS/ 'user options'는 비트 마스크 값입니다.
  • 64는 비트입니다 ARITHABORT ON

설정

SQLCMD (ODBC를 사용함)와 LINQPad (.NET SqlClient를 사용함) 모두로 테스트했습니다.

SQLCMD -W -S (local) ^
-Q"SELECT CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')') FROM sys.dm_exec_sessions ses WHERE ses.[session_id] = @@SPID;"
echo .

( ^DOS 행 연속 문자입니다. .마지막 행은 추가 행을 복사하여 붙여 넣기 쉽게하도록 강제하는 것입니다)

LINQPad에서 :

using (SqlConnection connection =
    new SqlConnection(@"Server=(local);Trusted_Connection=true;Database=tempdb;"))
{
  using (SqlCommand command = connection.CreateCommand())
  {
    command.CommandText = @"SELECT @RetVal =
CONCAT(DB_NAME(), N': ', @@OPTIONS & 64, N' (', ses.[client_interface_name], N')')
FROM  sys.dm_exec_sessions ses
WHERE ses.[session_id] = @@SPID;";
    SqlParameter paramRetVal = new SqlParameter("@RetVal", SqlDbType.NVarChar, 500);
    paramRetVal.Direction = ParameterDirection.Output;
    command.Parameters.Add(paramRetVal);

    connection.Open();
    command.ExecuteNonQuery();

    Console.WriteLine(paramRetVal.Value.ToString());
  }
}

테스트 1 : 이전

SQLCMD는 다음을 리턴합니다.

master: 0 (ODBC)

LINQPad는 다음을 반환합니다.

tempdb: 0 (.Net SqlClient Data Provider)

기본 연결 옵션 변경 :

다음 T-SQL은 ARITHABORT설정 될 수있는 다른 옵션을 제거하지 않고 ARITHABORT비트 마스크 된 값으로 이미 설정된 경우 아무것도 변경하지 않고 사용할 수 있습니다 .

DECLARE @UserOptions INT;

-- Get current bitmasked value and ensure ARITHABORT is enabled:
SELECT @UserOptions = CONVERT(INT, cnf.[value_in_use]) | 64 -- enable "ARITHABORT"
FROM   sys.configurations cnf
WHERE  cnf.[configuration_id] = 1534 -- user options

-- Apply new default connection options:
EXEC sys.sp_configure N'user options', @UserOptions;
RECONFIGURE;

테스트 2 : 후

SQLCMD는 다음을 리턴합니다.

master: 64 (ODBC)

LINQPad는 다음을 반환합니다.

tempdb: 64 (.Net SqlClient Data Provider)

결론

을 고려하면:

  1. 갖는 데 아무런 이점이없는 것 같습니다 ARITHABORT OFF
  2. 갖는 이점이 있습니다 ARITHABORT ON
  3. 기본 연결 설정 (연결에 의해 재정의되지 않은 경우) = OFF
  4. ODBC 또는 OLEDB / .NET SqlClient가 설정을 시도하지 않으므로 ARITHABORT기본 설정을 사용합니다.

인스턴스 전체의 기본 연결 옵션을 변경하는 것이 좋습니다 (위 그림 참조). 이것은 응용 프로그램을 업데이트하는 것보다 덜 눈에 잘 띄지 않습니다. 인스턴스 전체 설정을 변경하는 데 문제가있는 경우 에만 앱을 업데이트 합니다.

PS 나는 변화와 간단한 테스트했다 tempdb하지 인스턴스 전체 설정을 변경하고 그것은 작동하지 않았다.


1
허, 주제에 대해 Paul White와 함께이 Q & A를 읽은 후 SET ANSI_WARNINGS ON을 전달하면 내재적으로 ARITHABORT가 ON으로 설정됩니다. 그러나 SET ARITHABORT OFF도 연결에서 전달되면 ANSI_WARNINGS가이를 무시하더라도 이상한 계획을 선택할 때처럼 ARITHABORT가 OFF 인 것처럼 SQL 서버는 여전히 "작동"합니다. 나는 이것을 발견했다. 의심의 여지없이 연결에서 설정해야하며 SET ARITHABORT OFF도 존재할 수 없습니다. 사건이 눈에 ... 다 ... sqlservercentral.com/forums/topic/…
Eric Swiggum

@EricSwiggum 재미있는 스레드를 찾았습니다. 그러나 해당 정보에서 연결에서 설정해야한다고 결론을내는 방법을 알 수 없습니다. 아무것도 현재를 오버라이드 (override)되지 않으면, 우리는 알고 SET ARITHABORT OFF있다 되지 존재. 그렇다면 왜 그것이 걱정되는지? 우리가 기본값이 재정의되는 곳에서 본 유일한 인스턴스는 SSMS를 기본값으로 설정하는 것입니다 ON(좋은 것입니다). 어느 쪽이든, 나는 테스트로 내 대답을 업데이트했으며 (기존 정보 당) 가장 논리적 인 권장 사항으로 보았습니다.
솔로몬 루츠 키

1
동의합니다. 인스턴스 전체 설정을 기본값으로 사용하십시오. 그러나 궁극적으로 연결은 설정 내용을 제어합니다. 다양한 기술 / 프로토콜이 SQL에 연결되는 공유 인스턴스의 경우는 어떻습니까? 내 말은, 미친 사람처럼 개발하기 위해 뛰어 다니고 "SET ARITHABORT ON"을 외쳐야합니까? 또는 최소한 가능하다면 ARITHABORT OFF의 부재를 장려하십시오. 또한 6 년째 인 풀 타임 DBA로 지금까지이 상황이 머리에 닿지 않은 것도 이상합니다. 어쩌면 내가 충분히 열심히 조사하지 않은 경우 일 수 있습니다. 폴이나 에를 랜드, 롤리를 도와 줘이게 뭐야?
Eric Swiggum

@EricSwiggum 1) 인스턴스 수준 기본값을 변경하면 소리 지르지 않아도됩니다. 2) 실제 발병률을 발견 한 ARITHABORT OFF 경우 에만 부재를 홍보해야 합니다. 지금까지는 없을 것입니다. 3) 이는 쿼리 계획에 영향을주기 때문에 테이블에 충분한 데이터가 없어서 SQL Server가 특정 선택 항목을 고려하도록 할 수 있습니다. 이제 더 많은 선택 항목이 있고 일부는 잘못되었습니다. 또는 오래된 통계 등과 같은 다른 일시적 요인이있을 수 있습니다. 완전히 확실하지 않습니다.
Solomon Rutzky

@EricSwiggum 나는 당신과 동의하지 않습니다. 나는 이것이 내 대답을 시작할 때 언급 한 것과 매우 유사하다고 생각합니다 (즉, 미국 영어 시스템의 기본 데이터 정렬). 레거시 시스템이 업그레이드시 오류 (즉, 이전 버전과의 호환성 보장)가 발생하는 것에 대한 Microsoft의 두려움은 실제로보다 좋지 않습니다. 비 이상적인 시나리오의 설치 기반 / 범위를 증가시킵니다. 이로 인해 과거에도 계속해서 끌어 당기는 힘이 커지고 상황이 나아질 가능성이 점점 높아지고 있습니다. 이것들은 반창고를 벗겨 내고 지금 당장 고통을 얻는 것이 더 나은 경우입니다.
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.