지금 생성된 테이블들의 컬럼을 보면 사이즈 정의가 없이 생성된 것들 다수 볼 수 있다.

사이즈 정의와 미정의 일때에 차이가 어떻게 되는지 알아보자.

 

PostgreSQL에서 VARCHAR 데이터 유형에 사이즈를 정의하지 않으면 기본적으로 가변 길이 문자열을 나타내는 데이터 타입이 됩니다.

VARCHAR 유형은 가변 길이 문자열을 저장할 수 있으므로 필요한 만큼의 공간을 사용합니다.

만약 VARCHAR에 사이즈를 정의하지 않으면 최대 1GB까지 문자열을 저장할 수 있습니다.

이는 대부분의 상황에서 충분한 용량이지만, 더 큰 문자열을 저장해야 하는 경우 CLOB (Character Large Object) 데이터 유형을 고려할 수도 있습니다.

 

VARCHAR의 사이즈를 정의하지 않으면 다음과 같은 장점과 단점이 있을 수 있음.

장점:

  • 필요한 만큼의 공간을 동적으로 할당하여 문자열을 저장할 수 있음.
  • 데이터 크기가 작은 경우에는 메모리 사용량이 최소화

 

단점:

  • 문자열의 최대 크기를 제한하지 않기 때문에 예기치 않은 큰 문자열이 저장될 수 있습니다.
  • 고정된 사이즈를 사용하는 CHAR 데이터 유형에 비해 속도가 약간 느릴 수 있습니다.
  • 데이터 유형의 제약 조건을 명확하게 정의하지 않아 데이터 일관성을 관리하기 어려울 수 있습니다.

사용하고자 하는 문자열의 크기에 따라 적절한 사이즈를 정의하는 것이 데이터베이스 설계의 중요한 부분입니다.

데이터의 예상 크기와 요구사항을 고려하여 적절한 VARCHAR 사이즈를 선택하는 것이 좋습니다.

 

PostgreSQL에서 VARCHAR의 사이즈를 정의하거나 정의하지 않은 경우에 따른 쿼리 수행계획에 대해 생각해보자.

쿼리 수행계획은 PostgreSQL 옵티마이저에 의해 생성되며, 데이터 유형과 사이즈는 이러한 계획에 영향을 줄 수 있다.

  1. VARCHAR 사이즈 정의한 경우: 예를 들어, VARCHAR(100)으로 사이즈를 정의한 테이블이 있다고 가정합니다. 그리고 다음과 같은 쿼리를 실행한다고 가정해보면
    • 쿼리 수행계획: PostgreSQL은 사전에 정의된 사이즈를 고려하여 일정한 길이의 문자열과 비교할 것으로 예상됨.
    • 따라서, 쿼리 옵티마이저는 인덱스 또는 스캔 등의 적절한 액세스 경로를 선택할 수 있습니다.
       
  2. VARCHAR 사이즈 정의하지 않은 경우: 사이즈를 정의하지 않은 가변 길이 VARCHAR에 대한 쿼리 수행계획 예시
    • 쿼리 수행계획: PostgreSQL은 문자열의 길이에 대한 정보를 알 수 없기 때문에 쿼리 옵티마이저는 일반적으로 전체 테이블 스캔을 선택할 수 있음.
    • 이는 인덱스를 사용하지 않고 모든 행을 검색하여 일치하는 결과를 찾는 방식입니다. 데이터의 크기가 커질수록 성능 저하가 발생할 수 있음.
 

사이즈를 정의한 VARCHAR의 경우 데이터의 길이를 사전에 알 수 있기 때문에 옵티마이저는 더 효율적인 쿼리 수행계획을 선택할 수 있음.

하지만 사이즈를 정의하지 않은 가변 길이 VARCHAR의 경우 데이터 길이에 대한 정보가 없으므로 일반적으로 전체 테이블 스캔과 같은 비효율적인 액세스 경로가 선택될 수 있음.

다만, 쿼리 수행계획은 옵티마이저의 판단에 따라 다를 수 있으며, 데이터의 크기와 분포, 인덱스 사용 여부 등 여러 요소에 따라 달라질 수 있습니다.

 

특별한 케이스가 아니면 사이즈 정의 하는것이 성능면에서도 이로운 점이 많다.

테이블 모델링시에는 컬럼 하나하나 신경써서 생성하는 습관을 들이는걸로…

+ Recent posts