본문 바로가기
IT 지식/데이터베이스

[PostgreSQL] 컬럼의 Length를 지정해야 하는 이유

by 이민우 2023. 7. 5.
728x90
반응형

이번 프로젝트에서 데이터 코어 구축 후 데이터 마트까지의 구축을 담당했다.

 

원래대로라면 데이터 마트 내 테이블의 컬럼들 각각에 length를 부여해줬을 것이다. 하지만 이번에는 구체적인 데이터의 양식이 주어지지 않았고, 그저 협력업체로부터 각 테이블에 들어갈 샘플 데이터 몇 개만 전달받았다. 그래서 데이터의 구체적인 도메인과 Length를 파악할 수 없었다.

*협력업체에 문의했는데 자기들도 모른단다.

 

그래서 어떻게 해야하나 생각을 하던 중 때마침 데이터 마트 구축으로 사용한 DB가 PostgreSQL라는 사실이 생각났다.

 

 

 

PostgreSQL은 VARCHAR 등의 칼럼에 굳이 Length를 지정해주지 않아도 됐고, 그래서 컬럼에 length를 지정해주지 않았다. 그러다 감리 진행 중 length를 지정하지 않았다는 사실을 지적받아 부랴부랴 협력업체를 닥달해 각 컬럼별 length를 전달받아 테이블을 수정했다.

 

그런데 이 작업을 하던 중 문득 궁금한 점이 생겼다.

 

테이블 내 컬럼에 Length를 지정할 때와 지정하지 않을 때는 어떤 차이가 있을까?

 

일단 알고있는 바만 읊어보자면 length를 지정해주는 것에 따른 장단점은 아래와 같다.

  1. 데이터의 일관성과 유효성이 보장된다.
  2. 데이터의 크기를 미리 예측해 저장 공간을 효율적으로 사용할 수 있다.

 

  1. 저장된 길이보다 긴 데이터의 저장이 시도되면 오류가 발생한다.
  2. 항상 동일한 길이의 데이터가 저장된다면 상관 없지만, 저장되는 값의 길이가 다양한 경우 짧은 데이터가 들어오면 쓸데없는 공간의 낭비가 발생할 수 있다.

 

즉, 항상 일정한 크기의 데이터를 받는다는 가정 하에서는 저장공간을 보다 효율적으로 사용하며 데이터의 일관성과 유효성이 보장될 수 있다.

다만 그에 반해 다양한 크기의 데이터를 받게될 경우 오류 발생의 가능성이 생기고, 작은 데이터 저장 시에는 쓸데 없는 공간의 낭비가 발생할 수 있다.

 

 

그렇다면 반대로 길이를 지정해주지 않는 것에 대한 장단점은 어떨까?

  1. 데이터의 크기에 상관없이 유연하게 데이터를 저장할 수 있다.

 

  1. 데이터의 유효성을 보장하기 어렵다.

 

즉, 유연하게 데이터를 저장할 수 있어서 크거나 작은 데이터를 전부 받을 수 있다. 다만 데이터라는 것은 원래는 도메인이 정해져있기 마련인데, 길이 체크를 하지 않기 때문데이터의 유효성 검증 방법이 한 가지 사라지고, 이에 따라 비정상적인 값이 저장될 가능성이 존재한다.

 

 

여기서 궁금한 점은 Length를 지정하는 방법과 지정하지 않는 방법이 얼마나 차지하는 용량의 차이가 크냐는 것이다.

궁금한 건 못참으니까 한 번 실험해보기로 했다.

 

우선 같은 양식이지만, Length 지정 유무에 따라 두 개의 테이블을 생성했다. (PostgreSQL)

CREATE TABLE IF NOT EXISTS test_one(
	test_col VARCHAR NOT NULL
);

CREATE TABLE IF NOT EXISTS test_two(
	test_col VARCHAR(10) NOT NULL
);

 

우선 각 테이블의 크기를 측정했다.

SELECT 
    pg_size_pretty(pg_total_relation_size('test_one')) AS "Non Length Total Size",
    pg_size_pretty(pg_total_relation_size('test_two')) AS "Length Total Size"
FROM 
    pg_class
LIMIT 1;

우선 Length를 지정하지 않은 테이블이 8192 bytes를 가지고 있음을 확인했다.

초기 사이즈가 다른 이유는 마지막에.

 

일단 두 테이블 모두에 각각 10만개의 데이터를 넣어보자.

INSERT INTO test_one
SELECT
    'a'
FROM
    generate_series(1, 100000);
    
INSERT INTO test_two
SELECT
    'a'
FROM
    generate_series(1, 100000);

그리고 다시 사이즈를 확인해보자.

Length를 지정하지 않은 테이블이 더 용량을 많이 차지함을 확인할 수 있다.

 

왜 Length를 지정하지 않은 테이블이 더 많은 용량을 차지할까?

궁금하니까 오늘도 역시 이력서 첨삭용으로 샀으나 그냥 심심이로 쓰이고 있는 ChatGPT에게 물어봤다.

 

아까 처음 테이블을 생성했을 때 Length를 지정한 칼럼이 8KB를 더 가지고 있었다.

즉 원본 데이터의 크기는 3568KB로 같으나, Length를 지정함으로써 길이 정보를 저장하는 8KB가 추가되어 Length를 지정한 테이블이 보다 큰 크기를 갖는 것이었다.

 

오늘도 새로운 사실을 배웠다.

 

이제 고작 2년을 넘은 풋내기 개발자가 이런 말을 하면 안되지만, 나름대로 IT 관련 지식은 박식하다고 생각하고 있었다. 하지만 오늘보니 아무래도 너무 큰 착각이었던 것 같다.

 

오만했던 나를 반성하며, 아직은... 아니 아마 일평생동안 아는 것보다 모르는 것이 더 많다는 사실을 명심해야겠다. 그리고 항상 겸손하게 살아야겠다.

728x90
반응형