database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 17004 게시물 읽기
No. 17004
[초보]NULL과 NOT NULL선택기준이 머죠?
작성자
최순진(combatbug)
작성일
2004-01-15 22:11
조회수
4,509

테이블을 만들다 보면 필드를 NULL값 허용 이나 NOT NULL로 설정할 수 있는데 선택 기준이 먼지 궁금합니다.

 

반드시 NOT NULL 설정해야하는 경우는 제가 알기로는 다음과 같구요.

-프라이머리키

-참조키

-유니크 인덱스필드

 

질문 1 :  업무로직상 반드시 값을 가지고있어야 하는 필드는 NOT NULL로 하는게 좋은가요? 아니면 INSERT할때 NULL여부를 검사해서 INSERT하는게 좋은가요?

 

질문 2 : NOT NULL로 설정하면 오라클이 내부적으로 인덱스를 생성해서 관리하나요? 그럼 업무로직상 반드시 값을 가지고있어야 하는 필드를 NOT NULL로 설정하면 INSERT/UPDATE할때 인덱스를 관리하는 시간때문에 속도가 느려지나요?(조금이라도..)

 

이 글에 대한 댓글이 총 3건 있습니다.

질문1 답변

-> NOT NULL이 더 좋습니다. 이는 차후 이 컬럼절에 대하여

    정렬(조건절 제외)을 하였을 경우 일반 인덱스를 주면은

    SORT영역없이 인덱스를 사용하여 성능에 상당한 영향을

    줍니다. NULL은 인덱스에 값이 없기 때문에 정렬(조건절제외)시

    인덱스를 사용못합니다.

 

질문2 답변

-> NOT NULL 설정되었다고 인덱스하고는 관계가 무관합니다.

    

님께서는 자료구조에 대해서 공부하시는게 좋을듯 싶습니다.

 

http://angel.sarang.net

  

보규니(jbk35)님이 2004-01-16 00:56에 작성한 댓글입니다.

안녕하세요?

 

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. 오라클에서 색인(B*Tree) 구성시 null은 빠집니다.

만약 where 조건에서   salary is null 이라는 조건으로 들어오면

null 은 색인 구성에서 빠지므로 이 조건은 색인을 활용할 수가 없게 됩니다.

 

 

 

이러한 not null, null 여부는 나중에 성능에 지대한 영향을 줄 수도 있고, 개발자들에게 nvl을 남발하게 될 수도 있으므로 주의하여야 합니다.

김주현님이 2004-01-16 01:34에 작성한 댓글입니다. Edit

답변에 감사드립니다.

최순진(combatbug)님이 2004-01-16 16:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
17008통계 데이터 sql문 봐주세요~` [1]
김경용
2004-01-16
5492
17007vb에서 오라클 패키지로 레코드셋과 다른 output을 같이 가져올 수 없나요?? [1]
양영준
2004-01-16
2249
17005JOIN속도 비교 [3]
김민수
2004-01-16
2178
17004[초보]NULL과 NOT NULL선택기준이 머죠? [3]
최순진
2004-01-15
4509
17003한글 자음별로 쿼리하는 방법 좀 알려주세요.. [2]
장만호
2004-01-15
2343
17002[백업] 급 합니다 고수님 도와 주세요 [1]
정주현
2004-01-15
2025
17000exp에 대해서요 [1]
always10
2004-01-15
2791
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다