본문 바로가기

프로그래밍/MSSQL

[MSSQL] ARITHABORT (웹 서비스단 프로시저 timeout 이슈)

반응형

 

 

 

 

 

[MSSQL] RECOMPILE 저장 프로시저 리컴파일 (c# 프로시저 timeout 에러)

 

위의 글에서 설명하듯이 웹 서비스단에서 호출된 프로시저에서 timeout 이슈가 발생했다.

 

그런데 해당 프로시저를 SSMS에서 호출시켜보니 0초도 안돼서 결과가 나오는게 아닌가..

 

당시 RECOMPILE을 통해 해결한 줄 알았으나.. 아니었다..

 

해당 문제는 지금 설명할 ARITHABORT로 해결했다.

 

+추가 

해결되지 않았습니다... 글 하단 참고

 

 

 

웹서비스 단에서 호출되는 프로시저의 실행계획과 DB툴(SSMS)에서 호출되는 프로시저의 실행계획이 상이할 수 있다.

 

> 웹서비스 단에서 호출된 프로시저는 ARITHABORT 설정 값이 OFF (.NET)

 

> DB툴(SSMS)에서 호출된 프로시저는 ARITHABORT 설정 값이 ON

 

https://docs.microsoft.com/ko-kr/sql/t-sql/statements/set-arithabort-transact-sql?view=sql-server-ver15

 

ARITHABORT 설정 값을 OFF로 할 경우 쿼리 최적화에 부정적인 영향을 줘서, 성능 문제가 발생할 수 있다고 한다.

 

 

 

실제로 해당 프로시저를 SSMS에서 호출할 때 ARITHABORT 설정 값을 ON으로 하면 결과가 바로 나왔지만, OFF로 하고 호출해보니 매우 느렸다.

 

SET ARITHABORT ON;
EXEC USP_FOOD_LIST 1 -- 빠름

SET ARITHABORT OFF;
EXEC USP_FOOD_LIST 1 -- 매우 느림

 

 

해당 이슈는 일단 아래와 같이 프로시저 내에 SET ARITHABORT ON; 설정 부분을 추가하여 해결하였다.

 

CREATE PROCEDURE dbo.USP_FOOD_LIST
(
	@id INT
)
AS
BEGIN
	SET ARITHABORT ON;
    
	... 쿼리문
END

 

 

>> ARITHABORT 설정에 따라 실행계획이 다를 수 있다는 것을 명심하자!

 

 

 

 

+추가

 

해결된 줄 알았으나... 상황은 다시 반복됐다. 개미지옥이야...

아래 글을 참고하여, 강제로 인덱스를 설정해줘서 해결했다.

 

http://www.sommarskog.se/query-plan-mysteries.html

 

 

강제 인덱스 설정 방법은 아래 글 참고.

 

[MSSQL] WITH INDEX 인덱스 강제 설정 (테이블 힌트)

 

 

 

반응형