Oracle null의 특성 및 null 체크함수
페이지 정보
본문
null 의 특징은...
1. sum, count 등 집합함수나 연산시 null과의 연산은 null 이 됩니다.
즉, null 인 컬럼값에 100을 더하면 100이 되는게 아니라 null 이 됩니다.
select null + 100 from dual 의 결과는 null 이 됩니다.
null은 알 수 없는 값이기 때문에 '알지 못하는 값' 과의 연산은 '알지못하는값' 이 됩니다.
그리고 select count(salary) from emp 등에서 만약 salary 에 null 값이 들어있다면 null인 경우는 빼고 count를 합니다.
따라서 개발자들은 이러한 null 값 때문에 연산을 하거나 avg, sum등을 구할때 결과가 나오지 않는
상황을 경험하고는 null 공포증을 가지게 됩니다. 그래서 nvl을 남발하게 되는거구요.
따라서 위의 경우와 같이 EMP(사원) 테이블의 연봉(salary)같이 연산이 예상되는 숫자형 같은 경우는 특히 주의하여 DB 설계자가 'not null default 0' 로 셋팅해주는 것이 좋습니다.
2. NOT NULL로 설정하면 오라클이 내부적으로 인덱스를 생성해서 관리하나요? 그럼 업무로직상 반드시 값을 가지고있어야 하는 필드를 NOT NULL로 설정하면 INSERT/UPDATE할때 인덱스를 관리하는 시간때문에 속도가 느려지나요?
--> 오라클에서 색인(B*Tree) 구성시 null은 빠집니다.
만약 where 조건에서 salary is null 이라는 조건으로 들어오면 null 은 색인 구성에서 빠지므로 이 조건은 색인을 활용할 수가 없게 됩니다.
NOT NULL 설정되었다고 인덱스하고는 관계가 무관합니다.
3. 업무로직상 반드시 값을 가지고있어야 하는 필드는 NOT NULL로 하는게 좋은가요? 아니면 INSERT할때 NULL여부를 검사해서 INSERT하는게 좋은가요?
-> NOT NULL이 더 좋습니다. 이는 차후 이 컬럼절에 대하여 정렬(조건절 제외)을 하였을 경우 일반 인덱스를 주면은 SORT영역없이 인덱스를 사용하여 성능에 상당한 영향을 줍니다. NULL은 인덱스에 값이 없기 때문에 정렬(조건절제외)시 인덱스를 사용못합니다.
nvl : 컬럼값이 null일 때, 다른 값으로 바꾸는 기능입니다
nvl 컬럼은 기본적으로 두개의 데이터 타입이 같아야 합니다 .
last_no 컬럼이 숫자이면
nvl( last_no , 0)
last_no 컬럼이 문자이면
nvl( last_no , '0') 이렇게 해주시면 됩니다 .
자료출처
http://bluejames77.blog.me/80004276310
http://database.sarang.net/?inc=read&aid=17004&criteria=oracle
1. sum, count 등 집합함수나 연산시 null과의 연산은 null 이 됩니다.
즉, null 인 컬럼값에 100을 더하면 100이 되는게 아니라 null 이 됩니다.
select null + 100 from dual 의 결과는 null 이 됩니다.
null은 알 수 없는 값이기 때문에 '알지 못하는 값' 과의 연산은 '알지못하는값' 이 됩니다.
그리고 select count(salary) from emp 등에서 만약 salary 에 null 값이 들어있다면 null인 경우는 빼고 count를 합니다.
따라서 개발자들은 이러한 null 값 때문에 연산을 하거나 avg, sum등을 구할때 결과가 나오지 않는
상황을 경험하고는 null 공포증을 가지게 됩니다. 그래서 nvl을 남발하게 되는거구요.
따라서 위의 경우와 같이 EMP(사원) 테이블의 연봉(salary)같이 연산이 예상되는 숫자형 같은 경우는 특히 주의하여 DB 설계자가 'not null default 0' 로 셋팅해주는 것이 좋습니다.
2. NOT NULL로 설정하면 오라클이 내부적으로 인덱스를 생성해서 관리하나요? 그럼 업무로직상 반드시 값을 가지고있어야 하는 필드를 NOT NULL로 설정하면 INSERT/UPDATE할때 인덱스를 관리하는 시간때문에 속도가 느려지나요?
--> 오라클에서 색인(B*Tree) 구성시 null은 빠집니다.
만약 where 조건에서 salary is null 이라는 조건으로 들어오면 null 은 색인 구성에서 빠지므로 이 조건은 색인을 활용할 수가 없게 됩니다.
NOT NULL 설정되었다고 인덱스하고는 관계가 무관합니다.
3. 업무로직상 반드시 값을 가지고있어야 하는 필드는 NOT NULL로 하는게 좋은가요? 아니면 INSERT할때 NULL여부를 검사해서 INSERT하는게 좋은가요?
-> NOT NULL이 더 좋습니다. 이는 차후 이 컬럼절에 대하여 정렬(조건절 제외)을 하였을 경우 일반 인덱스를 주면은 SORT영역없이 인덱스를 사용하여 성능에 상당한 영향을 줍니다. NULL은 인덱스에 값이 없기 때문에 정렬(조건절제외)시 인덱스를 사용못합니다.
nvl : 컬럼값이 null일 때, 다른 값으로 바꾸는 기능입니다
nvl 컬럼은 기본적으로 두개의 데이터 타입이 같아야 합니다 .
last_no 컬럼이 숫자이면
nvl( last_no , 0)
last_no 컬럼이 문자이면
nvl( last_no , '0') 이렇게 해주시면 됩니다 .
자료출처
http://bluejames77.blog.me/80004276310
http://database.sarang.net/?inc=read&aid=17004&criteria=oracle
댓글목록
등록된 댓글이 없습니다.