[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 인덱스 강제 설정 (테이블 힌트)
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] LEN / DATALENGTH (문자열의 문자 수 / 바이트 수) (0) | 2020.02.05 |
---|---|
[MSSQL] WITH INDEX 인덱스 강제 설정 (테이블 힌트) (0) | 2020.02.04 |
[MSSQL] RECOMPILE 저장 프로시저 리컴파일 (c# 프로시저 timeout 에러) (0) | 2020.01.30 |
[MSSQL] NOT MATCHED BY SOURCE ('DELETE' 유형의 동작은 MERGE 문의 'WHEN NOT MATCHED' 절에 사용할 수 없습니다.) (0) | 2020.01.07 |
[MSSQL] BULK INSERT (CSV/TXT 파일 결과 저장 & 파일 INSERT) (1) | 2019.12.18 |