[sql-server] SQL Server에서 “Null”값이 차지하는 크기

10 개의 열이있는 큰 테이블이 있습니다. 그중 4 개는 대부분의 경우 null로 남아 있습니다. null 값을 사용하는 쿼리가 바이트 단위로 크기가 없거나 크기가 없습니다. 나는 그들 중 일부가 말하는 기사를 거의 읽었습니다.

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

테이블에 NULL 값이 있으면 저장 공간을 차지하지 않는다는 오해가 있습니다. 사실은 NULL 값이 공간을 차지합니다 – 2 바이트

SQL : NULL 값과 기본값 사용

NULL데이터베이스 의 값은 1 바이트의 스토리지를 차지하는 시스템 값이며 값이 공백, 0 또는 기타 기본값과 반대로 존재하지 않음을 나타냅니다.

null 값으로 찍은 크기에 대해 안내해 주시겠습니까?



답변

필드가 고정 너비 인 경우 NULL을 저장하면 다른 값 (필드 너비)과 동일한 공간을 차지합니다.

필드가 가변 너비 인 경우 NULL 값은 공간을 차지하지 않습니다.

null 값을 저장하는 데 필요한 공간 외에도 nullable 열을 갖는 오버 헤드도 있습니다. 각 행에 대해 해당 열의 값이 null인지 여부를 표시하기 위해 nullable 열당 1 비트가 사용됩니다. 이는 열이 고정 길이이든 가변 길이이든 마찬가지입니다.


다른 출처의 정보에서 관찰 한 불일치의 이유 :

  • 첫 번째 기사의 시작은 약간 오해의 소지가 있습니다. 이 기사에서는 NULL 값을 저장하는 비용이 아니라 NULL을 저장할 있는 비용 (즉, 열을 null 허용으로 만드는 비용)에 대해 설명합니다. 열을 nullable로 만들려면 저장 공간에 비용이 들지만 일단 수행하면 값을 저장하는 데 필요한 것보다 NULL을 저장하는 데 더 적은 공간이 필요합니다 (가변 너비 열의 경우).

  • 두 번째 링크는 Microsoft Access에 대한 질문 인 것 같습니다. Access가 NULL을 저장하는 방법에 대한 자세한 내용은 모르지만 SQL Server와 다르더라도 놀라지 않을 것입니다.


답변

열이 가변 길이 인 경우, 즉, 그 다음 링크 청구 varcharNULL0 바이트 소요 (값인지 더하기 1 바이트 플래그 사용 NULL여부)

위의 링크와 아래 링크는 고정 길이 열의 경우, 즉 char(10)또는 int의 값이 NULL열의 길이를 차지 한다고 주장합니다 (더하기 1 바이트를 추가하여 플래그 여부 표시 NULL).

예 :

  1. 당신이 설정 한 경우 char(10)NULL, 그것은 차지하고 10 바이트 (교체 아웃 제로)
  2. An int은 4 바이트를 사용합니다 (또한 0으로 처리됨).
  3. varchar(1 million)에 세트는 NULL0 바이트를 얻어 (+ 2 바이트)

참고 : 약간의 접선에서의 저장 크기는 varchar입력 된 데이터 길이 + 2 바이트입니다.


답변

이 링크에서 :

각 행에는 널을 허용하는 열에 대한 널 비트 맵이 있습니다. 해당 열의 행이 null이면 비트 맵의 ​​비트는 1이고 그렇지 않으면 0입니다.

가변 크기 데이터 유형의 경우 정확한 크기는 0 바이트입니다.

고정 크기 데이터 유형의 경우 acctual 크기는 기본값으로 설정된 바이트 단위의 기본 데이터 유형 크기입니다 (숫자의 경우 0, 문자의 경우 ”).


답변

NULL 값을 저장하면 공간이 필요하지 않습니다.

“사실은 NULL 값이 2 바이트의 공간을 차지한다는 것입니다.”

이것은 오해입니다. 즉 , 행당 2 바이트 이고 , nullable 열이 있는지 여부에 관계없이 모든 행 이이 2 바이트를 사용한다고 확신합니다.

데이터베이스의 NULL 값은 1 바이트의 스토리지를 차지하는 시스템 값입니다.

이것은 일반적으로 SQL Server가 아닌 데이터베이스에 대한 것입니다. SQL Server는 NULL 값을 저장하는 데 1 바이트를 사용하지 않습니다.


답변