Nullable 데이터 타입
Nullable 데이터 타입
T가 허용하는 정상 값과 함께 "누락된 값(missing value)"을 나타내는 특별한 마커(NULL)를 저장할 수 있게 해주는 타입이에요. 예를 들어 Nullable(Int8) 타입 컬럼은 Int8 타입 값을 저장할 수 있고, 값이 없는 행은 NULL을 저장해요.
출처: 문서
본문
T가 허용하는 정상 값 옆에 "누락된 값"을 나타내는 특별한 마커(NULL)를 저장할 수 있게 해줘요. 예를 들어 Nullable(Int8) 타입 컬럼은 Int8 타입 값을 저장할 수 있고, 값이 없는 행은 NULL을 저장해요.
T는 다음 복합 데이터 타입 중 하나일 수 없어요.
하지만 복합 데이터 타입은 Nullable 타입 값을 담을 수 있어요. 예를 들어 Array(Nullable(Int8)) 또는 Tuple(Nullable(String), Nullable(Int64)) 같은 식이에요. Nullable 타입 필드는 테이블 인덱스에 포함될 수 없어요. NULL은 ClickHouse 서버 설정에서 달리 지정하지 않는 한 모든 Nullable 타입의 기본값이에요.
저장 특성 (Storage Features)
Nullable 타입 값을 테이블 컬럼에 저장하기 위해 ClickHouse는 값이 있는 일반 파일에 더해 NULL 마스크가 있는 별도의 파일을 사용해요. 마스크 파일의 항목은 ClickHouse가 각 테이블 행에 대해 NULL과 해당 데이터 타입의 기본값을 구분하게 해줘요. 추가 파일 때문에 Nullable 컬럼은 비슷한 일반 컬럼에 비해 더 많은 저장 공간을 소비해요. Nullable을 사용하면 거의 항상 성능에 부정적 영향을 주므로, 데이터베이스를 설계할 때 이 점을 명심하세요.
NULL 찾기 (Finding NULL)
전체 컬럼을 읽지 않고 null 서브컬럼을 사용해 컬럼에서 NULL 값을 찾을 수 있어요. 저장된 NULL 마스크 바이트를 반환하는데, 해당 값이 있으면 0, NULL이면 0이 아닌 바이트(표준적으로 1)를 반환해요. 엄격한 0 또는 1이 필요하면 isNull을 사용해요.
예시 (Example)
쿼리:
CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);
SELECT n.null FROM nullable;
응답:
┌─n.null─┐
│ 0 │
│ 1 │
│ 0 │
│ 1 │
└────────┘
사용 예시 (Usage Example)
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
INSERT INTO t_null VALUES (1, NULL), (2, 3)
SELECT x + y FROM t_null
┌─plus(x, y)─┐
│ ᴺᵁᴸᴸ │
│ 5 │
└────────────┘