이번 프로젝트에서 데이터 코어 구축 후 데이터 마트까지의 구축을 담당했다.
원래대로라면 데이터 마트 내 테이블의 컬럼들 각각에 length를 부여해줬을 것이다. 하지만 이번에는 구체적인 데이터의 양식이 주어지지 않았고, 그저 협력업체로부터 각 테이블에 들어갈 샘플 데이터 몇 개만 전달받았다. 그래서 데이터의 구체적인 도메인과 Length를 파악할 수 없었다.
*협력업체에 문의했는데 자기들도 모른단다.
그래서 어떻게 해야하나 생각을 하던 중 때마침 데이터 마트 구축으로 사용한 DB가 PostgreSQL라는 사실이 생각났다.
PostgreSQL은 VARCHAR 등의 칼럼에 굳이 Length를 지정해주지 않아도 됐고, 그래서 컬럼에 length를 지정해주지 않았다. 그러다 감리 진행 중 length를 지정하지 않았다는 사실을 지적받아 부랴부랴 협력업체를 닥달해 각 컬럼별 length를 전달받아 테이블을 수정했다.
그런데 이 작업을 하던 중 문득 궁금한 점이 생겼다.
테이블 내 컬럼에 Length를 지정할 때와 지정하지 않을 때는 어떤 차이가 있을까?
일단 알고있는 바만 읊어보자면 length를 지정해주는 것에 따른 장단점은 아래와 같다.
- 데이터의 일관성과 유효성이 보장된다.
- 데이터의 크기를 미리 예측해 저장 공간을 효율적으로 사용할 수 있다.
- 저장된 길이보다 긴 데이터의 저장이 시도되면 오류가 발생한다.
- 항상 동일한 길이의 데이터가 저장된다면 상관 없지만, 저장되는 값의 길이가 다양한 경우 짧은 데이터가 들어오면 쓸데없는 공간의 낭비가 발생할 수 있다.
즉, 항상 일정한 크기의 데이터를 받는다는 가정 하에서는 저장공간을 보다 효율적으로 사용하며 데이터의 일관성과 유효성이 보장될 수 있다.
다만 그에 반해 다양한 크기의 데이터를 받게될 경우 오류 발생의 가능성이 생기고, 작은 데이터 저장 시에는 쓸데 없는 공간의 낭비가 발생할 수 있다.
그렇다면 반대로 길이를 지정해주지 않는 것에 대한 장단점은 어떨까?
- 데이터의 크기에 상관없이 유연하게 데이터를 저장할 수 있다.
- 데이터의 유효성을 보장하기 어렵다.
즉, 유연하게 데이터를 저장할 수 있어서 크거나 작은 데이터를 전부 받을 수 있다. 다만 데이터라는 것은 원래는 도메인이 정해져있기 마련인데, 길이 체크를 하지 않기 때문에 데이터의 유효성 검증 방법이 한 가지 사라지고, 이에 따라 비정상적인 값이 저장될 가능성이 존재한다.
여기서 궁금한 점은 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 관련 지식은 박식하다고 생각하고 있었다. 하지만 오늘보니 아무래도 너무 큰 착각이었던 것 같다.
오만했던 나를 반성하며, 아직은... 아니 아마 일평생동안 아는 것보다 모르는 것이 더 많다는 사실을 명심해야겠다. 그리고 항상 겸손하게 살아야겠다.
'IT 지식 > 데이터베이스' 카테고리의 다른 글
[DB] 두 개 컬럼을 인덱스로 묶고 그 중 하나로만 쿼리를 하면? (0) | 2024.01.16 |
---|---|
ON DELETE(UPDATE) 옵션 (0) | 2024.01.10 |
[DB] 격리수준 (0) | 2021.05.30 |
[DB & BOOT] 트랜잭션 (0) | 2021.05.30 |
[데이터베이스] JSON과 XML (0) | 2021.04.06 |