WITH T AS (
SELECT 'N' COL FROM DUAL UNION ALL
SELECT NULL COL FROM DUAL UNION ALL
SELECT 'Y' COL FROM DUAL
)
SELECT *
FROM T A
WHERE NOT EXISTS (SELECT *
FROM T B
WHERE B.COL = 'N'
AND B.COL = A.COL
)
by 아발란체
[2018.08.03 15:11:44]
NOT EXISTS 해도 NULL은 인덱스에 저장되지 않아 풀스캔 탈 것 같습니다.
데이타가 많아지면 NULL 때문에 풀스캔하여 느려지는 것은 어쩔 수 없을 것 같습니다.
구조적으로 변경해야 할 것 같습니다.
by 마농
[2018.08.06 07:55:12]
네. ( column IS NULL OR column <> 'N' ) 이렇게 하시면 됩니다.
또는. ( NVL(column, 'x') <> 'N' ) 이렇게도 가능하구요.
속도와 상관 없을 것 같네요.
( column <> 'N' ) 은 빠르게 실행되는데
( column IS NULL OR column <> 'N' ) 은 느리다면?
두 조건은 엄연히 다른 조건이므로 속도비교는 무의미합니다.
이건 조건문 때문에 느린게 아니라 구조적으로 느린거죠.
어차피 부정형 조건이라 인덱스도 못타는 조건이구요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.