2009-08-03 3 views

답변

12

:-) 거기에 널 (null)을 저장하지 않을 때 당신은 항상가로 설정 한다 그래서 그것은 항상 좋은 사용의 의미가 너무 지저분하기 때문에 열을 NULL로 유지하는 것이 바람직하다. 그 (것)들이 어떻게 문제로 당신을 얻을 수 있는지 좋은 의논을위한 What is the deal with NULLs?를보십시오.

최대 8.2 버전의 PostgreSQL에서는 소프트웨어가 NULL 값을 찾는 방식으로 가장 일반적인 유형 색인 (b- 트리)에서 비교하는 방법을 알지 못했습니다. 관련 비트가 documentation on index types 인 경우 "그러나 NULL은 IS =와 같지 않으며 인덱싱 할 수 없습니다"라는 메시지가 나타납니다. 이 단점에 대한 효과적인 단점은 NULL 값을 포함해야하는 쿼리를 지정하면 플래너가 해당 케이스에 대한 명백한 인덱스를 사용하여 쿼리를 충족시키지 못할 수도 있다는 것입니다. 간단한 예를 들어 인덱스로 가속화 할 수있는 ORDER BY 문이 있지만 쿼리가 NULL 값을 반환해야하는 경우 옵티마이 저는 결과에 NULL 데이터가 누락 될 수 있으므로 해당 인덱스를 사용할 수 없습니다. 그러므로 불완전하고 쓸모 없다. 옵티마이 저는이를 알고 테이블 대신 색인화되지 않은 스캔을 수행하며, 이는 매우 비쌀 수 있습니다.

PostgreSQL improved this in 8.3 "인덱스 열의 IS NULL 조건은 B- 트리 인덱스와 함께 사용할 수 있습니다". 따라서 NULL 값을 갖는 무언가를 색인하려고하여 화상을 입을 수있는 상황이 감소되었습니다. 그러나 NULL 의미가 여전히 고통 스럽기 때문에 8.3 계획 자라도 기대 한 바를 수행하지 못하는 상황에 처할 수도 있으므로 가능한 한 NOT NOT NULL을 사용하여 잘못 최적화 된 쿼리를 실행할 확률을 낮추어야합니다 .

+0

좋은 댓글이 ... 내가 널 (null)과 인덱스되지 사이의 관계를 몰랐다. 고마워! –

2

아니요, 실제로 테이블에 NULL을 저장하지 않는 한 인덱스는 똑같이 (그리고 똑같이 효율적으로) 보입니다. 열을 설정

에 NOT NULL하지만 다른 장점을 많이 가지고, 당신은

15

설정 NOT NULL은 성능에 아무런 영향을 미치지 않습니다. 수표에 대한 몇 가지 사이클 - 관련성이 없습니다.

그러나 더미 값 대신 실제로 NULL을 사용하여 성능을 향상시킬 수 있습니다. 데이터 유형에 따라 디스크 공간과 RAM을 많이 절약 할 수 있습니다., 따라서 모든 작업 속도가 빨라집니다.

NULL 비트 맵은 행에에 NULL 값이있는 경우에만 할당됩니다. 그것은 행에있는 모든 열 (NULL 여부)에 대해 에 대해 1 비트입니다. 최대 8 개 열의 테이블의 경우 null 비트 맵은 터플 헤더와 행 데이터 사이에 스페어 바이트를 사용하여 사실상 완전히 무료입니다. 그 후에 공간은 MAXALIGN의 배수로 할당됩니다 (일반적으로 64 바이트를 포함하여 8 바이트). 차이는 패딩에 손실됩니다. 따라서 각 행의 첫 번째 NULL 값 에 대한 전체 가격 (낮은 가격)을 지불하십시오.. 추가 NULL 값은 공간을 절약 할 수 있습니다.

비 널값 최소 저장 요구는 통상적

1 바이트 (boolean, "char" ...) 또는 많이 보다 더한 정렬 (가능) 패딩이다. data types을 읽거나 시스템 테이블 pg_type의 세부 정보를 확인하십시오.널 스토리지에 대한

더 :

+0

"수표주기"란 무엇을 의미합니까? – ma11hew28

+2

@MattDiPasquale : Postgres는 제약 조건을 적용하고 충족되지 않으면 예외를 발생시켜야합니다. NULL에 대한 테스트가 매우 간단하므로 비용은 무시할 수 있습니다. –

관련 문제