SQL Server에서 "Null"값이 차지하는 크기


118

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 값으로 찍은 크기에 대해 안내해 주시겠습니까?

답변:


146

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

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

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


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

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

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


1
@Mark "열을 nullable로 만드는 데 저장 공간에 비용이 드는 것은 사실입니다.하지만 일단 수행하면 값을 저장하는 데 필요한 것보다 NULL을 저장하는 데 더 적은 공간이 필요합니다 (가변 너비 열의 경우)." 가변 데이터 유형에 대해 메모리에서 차지하는 크기로 1 비트를 사용합니다.
Rocky Singh

13
대부분의 컴퓨터 시스템에서 주소 지정이 가능한 가장 작은 메모리 단위는 1 byte(일반적으로 8 비트)입니다. 따라서 실제로 bitbyte. 훌륭한 답변 Mark : +1.
JohnB

20
그러나 두 번째 비트와 세 번째 비트, 그리고 8 번째 비트까지 동일한 바이트에 맞습니다.
Matti Virkkunen

1
@Mark-예, 훨씬 더 명확 해 보입니다. 사라진 댓글에 대해 사과드립니다. 수정하려고했지만 삭제와 제출 사이에 인터넷 연결이 끊어졌습니다! 또한 비트에 따라 달라집니다 (여기의 주석 섹션에서) "힙 및 클러스터형 인덱스 레코드의 경우 항상 NULL 비트 맵이 있습니다. 비 클러스터형 인덱스의 경우 인덱스의 모든 열이 NULL이 아니면 존재하지 않습니다."
Martin Smith

2
@Martin Smith : 몰랐습니다. 그것은 내가 그것을 올바르게 이해하면 열을 nullable로 만들면 해당 열이 색인에 있고 다른 열이 색인에 있지 않는 한 필요한 저장 공간이 항상 증가하지 않기 때문에 일이 더 복잡해집니다. nullable이 아닙니다. 이 경우 인덱스는 이제 널 비트 맵을 포함해야합니다.
Mark Byers

30

열이 가변 길이 인 경우, 즉, 그 다음 링크 청구 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을 저장하는 varchar가 0 + 2 + 1 (NULL 오버 헤드) 바이트를 사용하지 않습니까?
Akash

NULL 플래그를 지정하려면 + 1 비트 여야 합니다. @Akash : 비트 맵이 이미 값을 NULL로 플래그 지정하므로 2 바이트가 필요하지 않습니다 (정보가 추가되지 않음).
Simo Kivistö

5

이 링크에서 :

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

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

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


nvarchar (max) varchar (max) Null과 같은 데이터 유형의 경우 0 바이트를 사용하고 int, chars 등의 경우 기본 크기를 기본값으로 사용합니까?
Rocky Singh

4

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.