DB/MS-SQL

OR 연산자 대신 IF을 사용하기

채윤아빠 2009. 6. 6. 16:55
728x90
반응형
저장 프로시저내에 다음과 같은 쿼리가 있었습니다.

하지만, 특이하게도 특정한 경우에 부하가 많이 걸려서 성능이 제대로 나오지 않는 경우가 있었습니다.
	DECLARE @ISN INT, @parent_ISN INT
	SET @ISN = 123142

	SELECT
		@parent_ISN=ISN
	FROM TEST_DB.dbo.test WITH (NOLOCK)
	WHERE 1 = 1
		AND (linked_isn1 = @ISN OR linked_isn2 = @ISN)

linked_isn1과 linked_isn2 각각의 컬럼에 독립적으로 인덱스가 잡혀 있었는데, 어느 때는 읽기 수가 1000이상이 나오면서 갑작스럽게 느려졌었습니다.

그래서 결국은 아래와 같이 IF문 형태로 코드를 변경하였습니다. 그랬더니, 이전과 같은 문제가 발생하지 않더군요.
	DECLARE @ISN INT, @parent_ISN INT
	SET @ISN = 123142

	SELECT
		@parent_ISN=ISN
	FROM PAPERS.dbo.articles_extra WITH (NOLOCK)
	WHERE 1 = 1
		AND linked_isn2=@ISN

	IF @parent_ISN IS NULL
	BEGIN
		SELECT
			@parent_ISN=ISN
		FROM PAPERS.dbo.articles_extra WITH (NOLOCK)
		WHERE 1 = 1
			AND linked_isn1=@ISN
	END

재미있는 것은 아래의 실행계획입니다.

OR를 사용하게 되면, 내부적으로 JOIN 등의 연산이 필요한데, IF 문으로 바꾸었더니, 매우 간결한 실행결과로 나왔고, 비용도 OR를 사용했을 때보다 50%나 감소했음을 알 수 있습니다.


이런 점들을 하나하나 보다보면 SQL은 참 신기하기도 하고, 재미나기도 합니다. ^^