1. 이 TEXT data type은 왜 필요한가?
🤖 일반적인 데이타 타입은 보통 varchar 로 생성해왔었다.
하지만, 오늘은 LOB (BLOB / CLOB 같은 대용량 데이터를 저장하는 컬럼 타입 ) Large Object 가 필요한 상황이다.
많은 데이터를 기록 할 데이터타입을 선택해야하는 상황이라는 것.
사용자의 필기 정보를 JSON 데이터로 저장하고 불러오는 작업을 해야하는데, 필기가 어느정도로 많아질 지 모르기 때문이다 .
필기 정보를 데이터로 저장하는 작업의 JSON 길이가 너무 길기도 길다.
하지만 이런 커다란 데이터 타입을 밀어넣으면 DB 서버가 힘들어 할 지 몰라서 왜? 언제? 써도 되는지? 에 대해 정리한다.
참고로 varchar 나 text 타입이나 모두 65,535 character 만 허용한다.
2. JSON을 넣으면 JSON 타입을 쓰는게 더 이득인가?
🤖 다음은postgresql 공식 문서의 설명이다.
json 타입도 어차피 text 로 저장되는데, JSON type은 각각 저장될때마다 JSON 규격 유효성 검사를 한다.
하지만 요구 사항에서는 클라이언트에서 검증된 JSON을 밀어넣을 것이기 때문에 검증까지는 필요가 없으므로 오히려 검증은 성능을 떨어뜨리는 원인이 된다.
반면에 JSON 타입에대한 검증이 필요하다면, 서버의 검증로직이 아닌 DB에 INSERT 시에 제공하는 검증을 이용하는게 더 이득일 수도있겠다. ( 구현에 따라 다름.)
json type은 json / jsonb 로 나눠지는데
간략히 말하면 jsonb는 not preserve white space, 즉 공백을 허용하지 않는다.
그러므로 TEXT를 선택.
🍅 MYSQL 에서는
json 의 특정 필드 접근 / 특정 필드만 수정 / 특정 필드의 인덱스 생성하는 경우가 아니라면 TEXT 타입의 컬럼을 사용하는게 더 빠른 성능이라고 한다.
참고 :
https://medium.com/daangn/json-vs-text-c2c1448b8b1f
3. TEXT 로 설정하면, 쓰지 않아도 되는 메모리까지 미리 할당 되어 있는가?
사실 이 것 때문에 공식문서를 찾아보았다.
결론은 varchar 와 text의 공간과 성능 차이는 없고, 불필요한 메모리를 미리 할당하지도 않는다.
텍스트의 사이즈는 제한이 없으므로, 가능한한 많은 메모리를 할당해 두지 않을까?
만약 그렇다면 메모리 낭비가 너무 심할거 같다고 생각했다.
회사에서쓰는 DB 버전은 12.대 버전이고,
공식문서를 보았다.
https://www.postgresql.org/docs/12/datatype-character.html
매우 긴 문자열은 background tables에 저장되고, 짧은 컬럼의 조회를 방해하지 않는다.
(최대 1GB까지 지원)
긴 문자열은 stored in background tables에 저장된다고 한다.
그리고
postgresql 에서 character / character varying / text 타입 간에는 성능상의 차이가 거의 없다고 말한다.
특히 Char 타입은 다른 DB 와 달리 이점이 거의 없다고 설명한다.
심지어 PostgreSQL에서는 character(n)이 추가 저장 비용으로 인해 세 가지 중에서 일반적으로 가장 느린 경우가 많다고 까지 한다.
* varchar 또는 char는 character varying의 별칭이다.
My-SQL 에서 고민하던 것과 달리 postgresql 에서는 텍스트 타입을 쓰는 방식이 크게 차이가 없다는 것을 알았다.
그러므로 결론은
varchar(n) vs text 는 가변타입과 제한 타입 차이가 존재하고,
varchar vs text 는 차이가 없다.
4. PostgreSQL 은 어떻게 데이터를 기록하는가?
postgresql 의 파일을 뜯어보면 다음과 같은 사실을 알 수 있다.
$ SELECT oid, datname FROM pg_database;
데이터베이스 하나에 폴더 하나가 매칭되고, 폴더 하나에는 각 테이블이 파일들이 매칭된다. ( 모두 테이블은 아니고, 인덱스, 시퀀스 등 나뉘어져 있다. )
즉 테이블(인덱스 등) 단위별로 파일을 나눠서 저장한다.
파일은 힙 파일이고, 힙 파일은 블록 - 튜플 단위로 구성된다.
저장은 그렇고 대규모 용량의 데이터는 데이터베이스의 성능을 저하시킨다, 저장공간에 대한 비용이 늘어나기 시작하면,
PostgreSQL은 TOAST 라는 메커니즘을 사용해서 저장하기 시작한다.
대규모 데이터를
페이지 단위(기본 8KB) 로 저장하되, 값이 너무 크다면, 내부 알고리즘을 통해 압축한다.
압축 후에도 값이 너무 크다면, 별도의 테이블 ( TOAST Table ) 로 이동시키고, 원래 테이블에는 포인터를 남겨두게 된다.
이러한 TOAST 유형이 적용되는 데이터 유형은 가변 길이 유형이다.
즉, 앞서 본 json, jsonb , 사이즈가 굉장히 큰 text 문자열 외에도
bytea , path, polygon , geometry, geography 와 같은 유형이 여기에 해당된다.
그러니까 공식 문서에서 말하는 back grounds table은 PostrgeSQL의 TOAST 방식을 사용한 별개의 테이블 파일에 저장한다는 이야기이다. ( 사이즈가 클 경우에 해당한다 Text 타입이라고 해서 모두 별개의 파일에 기록되는 것은 아니라는 것 )
참고:
참고:
https://seunghyunson.tistory.com/16
참고 :
https://www.postgresql.org/docs/12/datatype-json.html
'DB' 카테고리의 다른 글
[DB] VERTICA ifnull coalesce (0) | 2024.02.29 |
---|---|
[DB] postgresql recursive 재귀쿼리 (0) | 2023.12.07 |
[DB] MySQL CURRENT_TIMESTAMP (0) | 2023.10.05 |
[CURSOR PAGING] 커서 페이징처리. (2) | 2022.08.31 |
ORACLE DB DELETE / SHRINK SPACE (0) | 2022.02.28 |