SQL Server에서 "Null" 값의 크기
열 칸짜리 큰 테이블이 있습니다.그 중 4개는 대부분 무효로 남아 있습니다.null 값이 모든 크기(바이트) 또는 크기(바이트)를 사용하지 않는 쿼리가 있습니다.저는 몇몇 기사를 읽었습니다.
http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html
테이블에 NULL 값이 있으면 저장 공간을 차지하지 않는다는 잘못된 인식이 있습니다.NULL 값이 공간을 차지합니다(2바이트).
A
NULL
데이터베이스의 값은 스토리지의 1바이트를 차지하는 시스템 값이며 공백이나 0 또는 다른 기본값과 반대로 값이 존재하지 않음을 나타냅니다.
null 값으로 측정한 사이즈에 대해 안내해 줄 수 있습니까?
필드 너비가 고정된 경우 NULL을 저장하는 데 다른 값(필드 너비)과 동일한 공간이 사용됩니다.
필드가 가변 너비인 경우 NULL 값은 공간을 차지하지 않습니다.
null 값을 저장하는 데 필요한 공간 외에도 null 가능한 열을 갖는 데 필요한 오버헤드가 있습니다.각 행에 대해 null 가능한 열당 하나의 비트가 사용되어 해당 열의 값이 null인지 여부를 표시합니다.이는 열이 고정된 것이든 가변 길이든 상관없이 사실입니다.
다른 출처의 정보에서 관찰한 불일치의 이유:
첫 번째 기사의 시작 부분이 약간 오해의 소지가 있습니다.이 문서에서는 NULL 값을 저장하는 비용이 아니라 NULL을 저장할 수 있는 기능을 갖는 비용(즉, 열을 null로 만드는 비용)에 대해 설명합니다.열을 null로 만드는 데 스토리지 공간에 약간의 비용이 드는 것은 사실이지만, 일단 열을 null로 만들면 값을 저장하는 데 필요한 공간보다 NULL을 저장하는 데 더 적은 공간이 필요합니다(변수 너비 열의 경우).
두 번째 링크는 Microsoft Access에 대한 질문인 것 같습니다.액세스가 NULL을 저장하는 방법에 대한 자세한 내용은 모르지만 SQL Server와 다르더라도 놀라지 않을 것입니다.
다음 링크는 열이 가변 길이인 경우 즉,varchar
그리고나서NULL
0바이트를 사용합니다(또한 1바이트를 사용하여 값이 다음인지 여부를 표시합니다).NULL
또는 아님):
위의 링크와 아래의 링크는 고정 길이 열에 대해 다음과 같이 주장합니다.char(10)
또는int
의 값NULL
를 차지합니다(의가 1이로를추)).NULL
또는 아님):
예:
- 으로 설정하면,
char(10)
NULL
합니다. - 안 안
int
4바이트를 사용합니다(또한 0으로 설정됨). - A
varchar(1 million)
로 설정한.NULL
0바이트(+2바이트)가 소요됩니다.
접선에 는, 저장공간의 는 " " " " " " 입니다.varchar
입력한 데이터 길이 + 2바이트입니다.
다음 링크에서:
각 행에는 null을 허용하는 열에 대한 null 비트맵이 있습니다.해당 열의 행이 null이면 비트맵의 비트가 1이고 그렇지 않으면 0입니다.
가변 크기 데이터 유형의 경우 실제 크기는 0바이트입니다.
고정 크기 데이터 유형의 경우 실제 크기는 기본값으로 설정된 바이트 단위의 기본 데이터 유형 크기입니다(숫자의 경우 0, 문자의 경우 ").
NULL 값을 저장하는 데는 공간이 필요하지 않습니다.
"실제로 NULL 값은 2바이트의 공간을 차지합니다."
이것은 잘못된 생각입니다. 행당 2바이트입니다. 모든 행이 null 가능한 열이 있는지 여부에 관계없이 이 2바이트를 사용한다고 확신합니다.
데이터베이스의 NULL 값은 스토리지의 1바이트를 차지하는 시스템 값입니다.
이는 일반적으로 SQL Server가 아닌 데이터베이스에 대해 설명합니다.SQL Server는 NULL 값을 저장하는 데 1바이트를 사용하지 않습니다.
이 질문에는 SQL Server 2005라는 태그가 지정되어 있지만, 현재는 2021년이므로 2005년 이후의 모든 SQL Server 버전에 대한 "꼼수 질문"이라는 점을 지적해야 합니다.
이는 ROW 또는 PAGE 압축이 사용되거나 열이 SPARS로 정의되면 실제 행에 'NULL 값'을 저장할 공간이 없기 때문입니다.이러한 기능은 SQL Server 2008에 추가되었습니다.
ROW 압축(페이지 압축의 전제 조건)에 대한 구현 참고 사항은 다음과 같습니다.
모든 데이터 유형에서 NULL 및 0 값은 최적화되며 바이트를 사용하지 않습니다1.
각 실제2 레코드에는 희소하지 않은 열당 저장되는 최소 메타데이터(열당 4비트 + 레코드 오버헤드/열)가 여전히 있지만, 이 값은 절대적으로 아니며 모든3 경우에 필요합니다.
NULL 값이 아닌 값에 대한 트레이드오프가 있지만 NULL 값을 가진 SPARS 열은 공간을 차지하지 않고 행당 관련 메타데이터도 없습니다(SPARS 열 수가 증가함에 따라).
따라서 실제 DB 사용 통계를 분석하지 않고는 공간을 "카운트"하기가 어렵습니다.행당 평균 바이트 수는 정확한 열 유형, 테이블/인덱스 재구성 설정, 실제 데이터 및 이중성, 채우기 용량, 효과적인 페이지 활용률, 조각화, LOB 사용률 등에 따라 다르며 종종 더 유용한 메트릭입니다.
1 SQLite는 유사한 접근 방식을 사용하여 효과적으로 NULL 값을 사용하지 않습니다.
2 ROW(즉 PAGE) 압축에 사용되는 기술 레이아웃에 대한 간략한 설명은 "SQL Server 2012 내부: 특수 스토리지"에서 확인할 수 있습니다.
열 수에 대한 1 또는 2바이트 다음은 CD 배열입니다. CD 배열은 표의 각 열에 대해 4비트 [메타데이터]를 사용하여 열의 길이에 대한 정보를 나타냅니다. .. 0(0x0)은 해당 열이 NULL임을 나타냅니다.
3 재미있는 사실: ROW 압축을 사용하면 비트 열 값이 해당 4비트 메타데이터에 완전히 존재합니다.
언급URL : https://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server
'programing' 카테고리의 다른 글
프로그래밍 방식으로 ID 열이 있는 SQL 테이블을 결정하는 방법 (0) | 2023.04.26 |
---|---|
UI 보기의 맨 위에 테두리를 추가하는 방법 (0) | 2023.04.26 |
두 개의 목록 결합 및 중복 제거, 원래 목록의 중복 제거 안 함 (0) | 2023.04.26 |
기본값 대응:다음 키보드 버튼을 누른 후 다음 텍스트 입력을 선택하는 방법은 무엇입니까? (0) | 2023.04.26 |
Bash에서는 대괄호[ ]가 대괄호[ ]보다 좋습니까? (0) | 2023.04.21 |