not null에 관련해서 입니다. 0 4 1,626

by 한민 [2007.08.22 09:49:11]


-- NULL TEST
SELECT *
FROM (
 SELECT NULL AS A,  '11' B FROM DUAL
 UNION ALL
 SELECT '' AS A,  '22' B FROM DUAL
 UNION ALL
 SELECT '1' AS A,  '33' B FROM DUAL
 UNION ALL
 SELECT '2' AS A,  '44' B FROM DUAL
 UNION ALL
 SELECT ' ' AS A,  '55' B FROM DUAL
) C
WHERE
C.A IS NOT NULL -- 1
--C.A = DECODE(C.A, NULL, NULL, C.A) -- 2

 

1번째와 2번째의 쿼리 결과는 같습니다.

is not null 을 사용하지 않을려고 2번째 처럼 변형을 했습니다. 근데 맞는 표현일까요?

C.A = null 이런 표현식은 결과가 없을 것입니다. 그래서 no row가 발생하고,

나머지는 c.a = c.a 이니 널이 아닌 데이타만 나온다? 같은 표현일까요?

 

사족.

실제로 쓰고 있는 쿼리에서 is not null을 사용하고 있습니다. 요 부분에서 조회 쿼리

속도가 팍 떨어져서 변형을 할려고 이짓을 하고 있습니다.

그런데 해당 컬럼의

data type이 date라서 컬럼 > ' ' 이 방법도 못 쓰겠고 해서 요래 해보고 있습니다.

 

조언 부탁 드립니다.

근데 참 덥습니다.

by 마농 [2007.08.22 00:00:00]
사족으로 보이네요.
디코드는 무거운 함수로 알고 있습니다.
IS NOT NULL 때문에 늦어진다라???
다른 튜닝포인트가 있을거라 생각됩니다.

by 현 [2007.08.22 00:00:00]
is not null 때문에 속도가 확 떨어진다는 얘기는
아마 is not null이 인덱스 스캔을 하지 않고 풀스캔을 하기 때문일 겁니다.
위에 마농님 말씀처럼 다른 튜닝 포인트가 분명 있을 겁니다.

by 한민 [2007.08.22 00:00:00]
평상시(?)에는 문제가 없으나, 사용자가 많아
질때 is not null 부분에서 속도를 떨어뜨리고
있어서 변형을 해보고 있습니다.

답변 감사드립니다. 일단 다른데 더 찾아봐야
겠군요.

울산 덥습니다. 더워.

by finecomp [2007.08.22 00:00:00]
저도 사족인데...
date컬럼 데이터가 만약 1990년 이전은 없다면,
IS NOT NULL 대신에
AND C.A >= TO_DATE('19900101', 'yyyymmdd')
로 테스트 해 보면 어떨까요?

But 이는 IS NOT NULL의 Not조건을 피하기 위한 것일 뿐 인덱스scan의 확률은 아직도 희박 해 보이는군요.
실행계획등을 잘 살피어 문제되는 부분을 파악하는 것이 급할 듯 보입니다.

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