WHERE 절에서 문제. 0 4 1,690

by 한번사는인생 [SQLServer] [2023.02.15 12:21:46]


안녕하세요.

 

DECLARE @AAAA  VARCHAR(MAX);
SET @ExpenseIDs = N'1,2,3,4,5,6';
SELECT *
FROM [TABLE]
WHERE (
        (@AAAA IS NULL)
        OR ([column] IN (SELECT [value] FROM dbo.SplitString(@AAAA, ',')))
    )

 

위에와 같이, 테이블의 컬럼의 아이디 모음(@AAAA)을 가지고

테이블 조회를 하려고 합니다.

이때 데이터 조회가 너무 느리더라구요. 테이블을 전체 조회하는 느낌이 듭니다.

근데 (@AAAA IS NULL) OR 조건을 빼면 빠릅니다.

이유가 무엇일까요?ㅠㅜ

by 마농 [2023.02.15 13:19:33]

해당 컬럼에 인덱스가 있다는 가정하에
조회 조건이 들어오는 경우에는 인덱스 스캔
들어 오지 않는 경우에는 풀스캔으로 실행계획이 분리되어야 합니다.
그러나 느리다면 하나의 실행계획(풀스캔)으로만 풀리는게 아닐까요?
실행계획 확인해 보세요.
UNION ALL 로 쿼리 자체를 분리시켜 보세요.
 

SELECT *
  FROM [TABLE]
 WHERE @AAAA IS NULL
 UNION ALL
SELECT *
  FROM [TABLE]
 WHERE @AAAA IS NOT NULL
   AND [column] IN (SELECT [value] FROM dbo.SplitString(@AAAA, ','))
;

 


by 한번사는인생 [2023.02.15 13:33:45]

PK로 되어져 있는 컬럼입니다.

말씀주신 내용 중, 하나의 실행계획으로 풀린다는게 무슨말씀인지 잘 모르겠습니다ㅠㅜ


by 마농 [2023.02.15 15:27:53]

제가 제시한 쿼리처럼
두개의 쿼리가 각각 수행되는 것처럼 동작해야 합니다.
UNION 상단은 조건이 없을 경우 테이블 풀스캔을 타도록
UNION 하단은 조건이 있을 경우 인덱스 스캔을 타도록
하지만 질문의 쿼리가 느리다면 이와 같이 두가지로 나뉘어 동작하지 않고
조건이 있든 없든 상관없이 풀스캔 한가지만 타는게 아닐까? 생각되네요.


by 한번사는인생 [2023.02.15 15:59:30]

일단 UNION ALL로 해결하였습니다.

항상 고맙습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입