이전에도 질문을 드린적이 있었습니다.
그때 응용프로그램에서 sa로 접속 하였을때와 user로 접속하였을 때 차이가 난다고 올렸었습니다.
구글링을 해 보니, 응용프로그램에서는 세션에 따라 ARITHABORTH 부분이 OFF로 처리될 수 있다고 하는데요..
그래서, 웹 실행과 쿼리분석기의 실행에서 차이가 난다고 하네요..
프로파일러에서도 Execution Plan을 확인하니, 다르게 나타나는데, 이 부분은 아직 내공이 부족하여
어떤 부분에서 문제가 되고 있는지를 정확하게 알지는 못하고 있습니다.
해결
첫 번째 방법
쿼리분석기에서 DBCC FREEPROCCACHE 이렇게 처리 한 다음
실행하니깐 웹과 쿼리분석기에서 동일한 성능을 볼 수 있었습니다.
그런데, DBCC DBCC FREEPROCCACHE 이 부분은 어제 밤에 하였을 때에는 성능이 향상 되었다가
금일 오후에 다시 확인해 보니 다시 느려지는 현상이 발생하였습니다.
그리하여 다시 DBCC FREEPROCCACHE 하니깐 성능향상이 있었구요..
두 번째 방법
해결방법은 응용프로그램에서 프로시져를 호출하기 전에
Conn.Execute "SET ARITHABORTH ON"
프로시져 호출
이렇게 하니깐 쿼리분석기에서 호출한 속도와 동일하게 나타나는 것을 확인 하였습니다.
궁금한점
제가 궁금한점은 응용프로그램에서 ARITHABORTH 부분이 OFF로 처리 되었다는것을 어떻게 알 수 있는가입니다.
제가 DBA가 아니다 보니, SQL은 전문지식이 많이 부족합니다.
Comment 6
-
Terry
2016.01.07 23:14
-
Terry
2016.01.07 23:15
자세한 정보는 제가 검색해서 얻어걸린(?) 블로그에서 확인하시면 될듯하네요..
1) SET 옵션 확인
http://chozzahacker.blogspot.kr/2014/07/sessionset.html
2) Function 관련
-
Terry
2016.01.07 23:18
DECLARE @OPTION VARCHAR(32)
Declare @rtn_dataSET @OPTION = REVERSE(DBO.FUNC_DEC2BIN(@@OPTIONS))
Select @rtn_data = (Case When @OPTION, 7, 1) = '1' THEN 1 ELSE 0 END)
@rtn_data 값이 1이면 On, 0 이면 OFF 로 판별하면 될듯해요.
현재 세션 기준인듯..
(자세한 건 저도 잘 모름..-_-;;;)
-
팔개
2016.01.08 00:32
감사합니다.
분석해서 적용하는 부분은 고민을 좀 해봐야겠네요..
-
minsouk
2016.01.10 22:17
재현 가능하면 거의 찾을수 있어요 재현이 확실히 되나요? -
팔개
2016.01.11 23:52
지금 또 동일한 현상이 발생하고 있습니다.
몇일간은 괜찮았는데, 또 느려졌네요..
그래서 프로시져 호출전에
Conn.Execute "SET ARITHABORT ON"
이렇게 하니깐 속도가 빨라지네요..
궁금해서 검색하다가 얻어걸렸네요 ^^;;
---펑션---
CREATE FUNCTION FUNC_DEC2BIN (@DEC INT)
RETURNS VARCHAR(32)
AS
BEGIN
DECLARE @BIN VARCHAR(32)
SET @DEC = @DEC
SET @BIN = CONVERT(VARCHAR(32), CONVERT(VARBINARY(10), @DEC), 2)
SET @BIN = REPLACE(@BIN, '0', '0000')
SET @BIN = REPLACE(@BIN, '1', '0001')
SET @BIN = REPLACE(@BIN, '2', '0010')
SET @BIN = REPLACE(@BIN, '3', '0011')
SET @BIN = REPLACE(@BIN, '4', '0100')
SET @BIN = REPLACE(@BIN, '5', '0101')
SET @BIN = REPLACE(@BIN, '6', '0110')
SET @BIN = REPLACE(@BIN, '7', '0111')
SET @BIN = REPLACE(@BIN, '8', '1000')
SET @BIN = REPLACE(@BIN, '9', '1001')
SET @BIN = REPLACE(@BIN, 'A', '1010')
SET @BIN = REPLACE(@BIN, 'B', '1011')
SET @BIN = REPLACE(@BIN, 'C', '1100')
SET @BIN = REPLACE(@BIN, 'D', '1101')
SET @BIN = REPLACE(@BIN, 'E', '1110')
SET @BIN = REPLACE(@BIN, 'F', '1111')
RETURN @BIN
END
---펑션끝---
---쿼리시작---
DECLARE @OPTION VARCHAR(32)
SET @OPTION = REVERSE(DBO.FUNC_DEC2BIN(@@OPTIONS))
PRINT 'SET DISABLE_DEF_CNST_CHK ' + CASE WHEN SUBSTRING(@OPTION, 1, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET IMPLICIT_TRANSACTIONS ' + CASE WHEN SUBSTRING(@OPTION, 2, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET CURSOR_CLOSE_ON_COMMIT ' + CASE WHEN SUBSTRING(@OPTION, 3, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_WARNINGS ' + CASE WHEN SUBSTRING(@OPTION, 4, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_PADDING ' + CASE WHEN SUBSTRING(@OPTION, 5, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULLS ' + CASE WHEN SUBSTRING(@OPTION, 6, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ARITHABORT ' + CASE WHEN SUBSTRING(@OPTION, 7, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET QUOTED_IDENTIFIER ' + CASE WHEN SUBSTRING(@OPTION, 9, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET NOCOUNT ' + CASE WHEN SUBSTRING(@OPTION, 10, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULL_DFLT_ON ' + CASE WHEN SUBSTRING(@OPTION, 11, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULL_DFLT_OFF ' + CASE WHEN SUBSTRING(@OPTION, 12, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET CONCAT_NULL_YIELDS_NULL ' + CASE WHEN SUBSTRING(@OPTION, 13, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET NUMERIC_ROUNDABORT ' + CASE WHEN SUBSTRING(@OPTION, 14, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET XACT_ABORT ' + CASE WHEN SUBSTRING(@OPTION, 15, 1) = '1' THEN 'ON' ELSE 'OFF' END
---쿼리끝---