Null 에 관한 진실 ?
hopeship 수험생

답변 채택시 : 0코아

답변 4 추천 0 조회 4558 2013.03.13

오늘도 이렇게 질문하게 되네요.

프로젝트를 진행하다 보니 여러 웃기는 일이 많은데요. 확실히 이론적인 배경과 아울러 실전 경험이 있어야 누구나 호응할 수 있는 객관적인 답이 나오는것 같습니다.

질문할 사항은 아래와 같습니다.

number 데이터 타입에 not null 로 하고 초기값을 0 으로 주자는 안을 이야기 했는데, 옆에서 여러 가지 이야기가 들리는군요.

어떤 한분은 null 을 허용해야 된다. 왜냐하면 0을 주게되면(초기화하면) null 로 하면 저장공간을 차지 않는데, 0을 주면 공간을 차지하게 되지 않느냐란 논리고,

어떤 한분은 null 은 허용하되, 0으로 초기화 하자 이런 이야기들인데요.

나름 논리를 펴면서 이야기 하는데, 우습기도 하고, 개발자라 보니 다들 자기 고집만 세우는것 같기도 하고 저는 지금껏 not null 로 0으로 초기화 해서 개발 했습니다.

number 데이터 타입을 부여한 컬럼에 null 이 들어가면 사칙연산 시 문제가 발생하며, 0으로 초기화 하기 때문에 당연히 not null 로 해 주었는데 말입니다.

정말 null 로 저장되면 저장공간을 차지 하지 않는것인지 알고 싶습니다.

 

고수님들의 답변 부탁드리겠습니다.

감사합니다.

댓글 (0)
목록 답변등록
Null 에 관한 진실 ?
zzubzzub 2013.05.28

질문자로부터 답변이 채택 되었습니다.

jhchoi 님의 의견에 동의하면서 몇가지 추가해 봅니다

 

1. jhchoi 님 말씀처럼 null과 0이 업무적 차원에서 의미가 있는지를 판단하는 것이 먼저라고 생각 합니다. 저장공간은 큰 이슈가 아니게 보이네요. 숫자형식 컬럼이 아무리 많다고 해도 null 대신 0이 들어감으로써 대세에 영향 있는 성능 이슈는 없으므로.

사족을 붙이자면 null은 index에 편성되지 않기 때문에 index scan 시간을 줄일 수 있습니다.

 

2. nullable default 0 과 not null default 0 의 차이는 언뜻보면 없어보이지만 이미 데이터가 존재할 경우에는 있을 수 있습니다.

이미 null이 존재하는 대용량 테이블에 not null 제약을 추가하려면 null을 0으로 update 후 해야하기 때문이죠. (제약조건을 추가하려는 테이블/항목이 많다면 작업량을 무시 못하겠죠)

본문에 "어떤 한분"의 의견이 위 이유 때문이라면 충분히 시간을 가지고 컨버젼 하는 것이 좋습니다. 0과 null이 한 컬럼에 존재하면 여러가지로 애매모호 한 상황이 일어날 수 있겠지요.

댓글 (0)
Null 에 관한 진실 ?
jhchoi 2013.04.05
저는 좀 다른 의견 말씀드려볼까 합니다.

저도 테이블에 가능한 default value나 constraint 등을 정의해 주는 것이 옳다고 생각합니다.  
하지만 컬럼에 null 을 허용할 것인가, null을 허용하지 않고 default값을 설정할 것인가의 판단은 
어플리케이션 처리의 용이성이 아닌 업무적인 관점에서 다시 검토해볼 필요가 있다고 생각합니다.

예를 들어 특정 컬럼에 default 를 0으로 지정했을 때 컬럼값이 0인 경우, 
값이 발생하지 않은 것인지 아니면 발생했는데 0인 것인지 판단이 어렵습니다. 
만약 해당 업무에서 null 값에 대해 값이 발생하지 않았다고 판단을 해야 하는 경우, 
null값도 업무적으로 의미있는 값이 될 수 있읍니다.

따라서 이러한 사항은 개발 편의성을 기준으로 정의할 것이 아니라 
업무 담당자에게 검토하는 것이 옳다고 생각합니다.
(물론 대부분의 경우 null 값에 업무적인 의미를 부여하는 경우는 그리 많지는 않을것 같습니다)

물론 레코드의 길이에 따라서 Block I/O 수에 영향을 주는 것이 맞습니다. 
하지만 보통 무슨무슨 원장이라 불리는 테이블들과 같이, 
하나의 테이블에 컬럼 갯수가 매우 많은 경우 Block I/O 를 줄이기 위해 
테이블을 1:1로 수직분할하는 경우는 가끔 있으나, 
컬럼에 null허용이냐, default 값 설정이냐에 따른 데이터 사이즈 차이로 
고민하는 사이트는 흔하지는 않은 것 같습니다.
댓글 (0)
Null 에 관한 진실 ?
mrshin 2013.03.14

NULL 컬럼도 자릿수를 차지 하는 군요.

 

select '1', null, null,null,null,null,null,null,null,null,null,null,null,null   이런 컬럼이라면 뒷자리가 모두 null,이면 공간 차지 않을 수 있지만...

select '1', null, null,null,null,null,null,null,null,null,null,null,null,'y'  맨 뒤에 값이 들어 오면 null도 일정부분 저장공간을 차지합니다. 왜냐하면 어디까지가 null인지 표기해야 하니까요...

 

따라서  number 형태일때  null과 0을 구별해야 한다는 업무로직이 별도로 없다면... not null 디폴트 0 처리하는 것이 여러모로 이로울것 같습니다.

 

 

댓글 (0)
Null 에 관한 진실 ?
gsjung 2013.03.14

좀전에 답변이 잘못되어 다시 올립니다.

 

BLOCK크기를 확인 해보니 테이블에 공간을 차지 하고 있음을 알 수 있었습니다.

값이 NULL 이지만 8,92 개의 NULL을 넣었을때 ROW수가 8192 개 존재하고 BLOCKS 는 13개 를 차지 하고 있었습니다.

 

---------------------------------------------------------------------------------------------------------------

 

DROP TABLE T_NUM_TEST2;

 

CREATE TABLE T_NUM_TEST2
(
   VAL10 NUMBER(10)
)

/*

  NULL 값만 INSERT 하는 SQL문장을 8192 개 생성하여 실행함.

*/
SELECT 'INSERT INTO T_NUM_TEST2 VALUES ( NULL );' SQL
FROM DUAL CONNECT BY LEVEL <= 8192
;

 

/*

테스트 테이블에 대한 통계정보 생성

*/

EXEC DBMS_STATS.GATHER_TABLE_STATS('KYUSU','T_NUM_TEST2');

 

/*

T_NUM_TEST2 에 대한 통계정보 확인

*/

SELECT TABLE_NAME,PCT_FREE,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_ROW_LEN
FROM USER_TABLES
WHERE TABLE_NAME = 'T_NUM_TEST2'
;

 

TABLE_NAME

PCT_FREE

NUM_ROWS

BLOCKS

EMPTY_BLOCKS

AVG_ROW_LEN

T_NUM_TEST2

10

8192

13

0

0

 

 

참고) http://www.dator.co.kr/thinking/textyle/412894


댓글 (0)