MSSql 스토어드 프로시져 사용시에만 Timeout에러. 잘못된게 없는데 에러나는 저장함수 호출
난생 처음 겪는 특이한 일이었다.
4시간은 족히 쳐다본거같다.
진작에 구글링할걸,,,,,,, 에러가 워낙 신기해서 한참보다가 구글링해서 금방해결했다...
증상
c# 코드에서 갑자기 SqlConnection으로 스토어드 프로시져 호출시 timeout 에러가 난다.
이 때 SSMS(SqlServerManagementStudio)에서 동일한 매개변수로 호출 시 잘 작동한다.
또한 스토어드 프로시져 내의 쿼리를 가져와 SqlCommand의 CommandType을 text로 변경하여 날려도 잘 작동한다.
게다가 c#코드에서 동일한 쿼리를 호출하는데 파라미터 값만 살짝 다르면 잘 작동한다.
즉, c# 코드에서 스토어드 프로시져 호출시 timeout에러가 나긴하는데.
평소에는 잘 작동하고
db쿼리에서도 작동을하고,
c# 코드에서 날쿼리로 날려도 작동을하는
뭐가 문제인지 모를 상황.
Recompile하면된다.
https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/recompile-a-stored-procedure
여길 보면 DB스키마 등 변경이있을 때 , 이 옵션을 쓰면 쿼리 플랜 등을 recompile하고 최적화하여, 성능향상도 가능하다고 나와있다.
방법은 3가지
1. Stored 생성시 WITH RECOMPILE
CREATE PROCEDURE 프로시져명
@매개변수 varchar(30) = '%'
WITH RECOMPILE
AS SET NOCOUNT ON;
....
2. Stored 호출시 RECOMPILE
EXECUTE 프로시져명 WITH RECOMPILE;
3. sp_recompile 프로시져로 RECOMPILE하기
EXEC sp_recompile N'프로시져명';