왜 SPARSE COLUMN을 사용해야합니까? (SQL SERVER 2008)
SQL Server 2008의 새로운 기능인 "SPARSE COLUMN"에 대한 몇 가지 자습서를 살펴본 결과 열 값이 0 또는 NULL이면 공간을 차지하지 않지만 값이 있으면 일반 공간보다 4 배 많은 공간이 필요함을 발견했습니다. (비 희소) 열 보유.
내 이해가 정확하다면 데이터베이스 설계시 왜 그렇게할까요? 그리고 그것을 사용하면 어떤 상황에 처하게 될까요?
또한 호기심으로 인해 열이 희소 열로 정의 될 때 공간이 예약되지 않는 이유는 무엇입니까? (내 말은 그 내부 구현은 무엇입니까?)
희소 열은 값을 저장하는 데 4 배의 공간 을 사용하지 않으며 , null이 아닌 값당 4 바이트의 추가 바이트를 사용 합니다. (이미 언급했듯이 NULL은 0 공간을 차지합니다.)
따라서 비트 열에 저장된 null이 아닌 값 은 1 비트 + 4 바이트 = 4.125 바이트입니다. 그러나 이들 중 99 %가 NULL이면 여전히 순 절감액입니다.
GUID (UniqueIdentifier) 열에 저장된 널이 아닌 값 은 16 바이트 + 4 바이트 = 20 바이트입니다. 따라서 이들 중 50 % 만 NULL이면 여전히 순 절감액입니다.
따라서 "예상 절감액"은 우리가 말하는 열의 종류 와 null 대 non-null 비율에 대한 추정치에 따라 크게 달라집니다 . 가변 너비 열 (varchars)은 정확하게 예측하기가 조금 더 어려울 수 있습니다.
이 온라인 설명서 페이지 에는 혜택을 받기 위해 null이어야하는 다양한 데이터 유형의 백분율 을 보여주는 표 가 있습니다.
그렇다면 Sparse Column은 언제 사용해야합니까? 상당한 비율의 행이 NULL 값을 가질 것으로 예상하는 경우. 떠오르는 몇 가지 예 :
- 주문 테이블 의 " 주문 반품 날짜 "열. 판매의 아주 적은 비율로 제품이 반품되기를 바랍니다.
- 주소 테이블 의 " 4 번째 주소 "줄. 부서 이름과 "Care Of"가 필요한 경우에도 대부분의 우편 주소에는 4 줄이 필요하지 않을 것입니다.
- 고객 테이블 의 " 접미사 "열. 상당히 낮은 비율의 사람들이 "Jr"을 가지고 있습니다. 또는 이름 뒤에 "III"또는 "Esquire".
희소 열에 널을 저장하는 것은 공간을 전혀 차지하지 않습니다.
모든 외부 응용 프로그램에서 열은 동일하게 작동합니다.
스파 스 열은 열에서 비어 있지 않은 속성을 처리하기위한 인덱스 만 생성하기를 원하기 때문에 필터링 된 인덱스에서 정말 잘 작동합니다.
집합에 포함 된 열에서 Null이 아닌 모든 데이터의 xml 클립을 반환하는 스파 스 열에 대해 열 집합을 만들 수 있습니다. 열 집합은 열 자체처럼 작동합니다. 참고 : 테이블 당 하나의 열 집합 만 가질 수 있습니다.
변경 데이터 캡처 및 트랜잭션 복제는 모두 작동하지만 열 집합 기능은 작동하지 않습니다.
단점
스파 스 열에 데이터가있는 경우 일반 열보다 4 바이트가 더 많이 사용됩니다. 예를 들어 비트 (일반적으로 0.125 바이트)도 4.125 바이트이고 고유 식별자는 16 바이트에서 20 바이트로 증가합니다.
모든 데이터 형식이 희소 할 수있는 것은 아닙니다. 텍스트, ntext, 이미지, 타임 스탬프, 사용자 정의 데이터 형식, 기하학 또는 지리 또는 FILESTREAM 특성이있는 varbinray (최대)는 희소 할 수 없습니다. (2009 년 5 월 17 일 변경됨 오타를 발견 한 Alex에게 감사드립니다)
계산 열은 희소 할 수 없습니다 (희소 열은 다른 계산 열의 계산에 포함될 수 있음).
규칙을 적용하거나 기본값을 가질 수 없습니다.
스파 스 열은 클러스터형 인덱스의 일부를 구성 할 수 없습니다. 그렇게해야하는 경우 희소 열을 기반으로 계산 된 열을 사용하고 여기에 클러스터형 인덱스를 만듭니다 (객체를 무력화하는 방식).
병합 복제가 작동하지 않습니다.
데이터 압축이 작동하지 않습니다.
희소 열에 대한 액세스 (읽기 및 쓰기)는 더 비싸지 만 이에 대한 정확한 수치를 찾을 수 없습니다.
당신은 그것을 잘못 읽고 있습니다-결코 4 배의 공간을 차지하지 않습니다.
특히 4x (4 곱하기)가 아니라 4 * (4 바이트, 각주 참조)로 표시됩니다. 공간이 정확히 4 배인 유일한 경우는 char (4)이며, NULL이 64 % 이상 존재할 경우 절약됩니다.
"* 길이는 유형에 포함 된 데이터의 평균에 2 또는 4 바이트를 더한 것과 같습니다."
| datetime NULL | datetime SPARSE NULL | datetime SPARSE NULL |
|--------------------|----------------------|----------------------|
| 20171213 (8 bytes) | 20171213 (12 bytes) | 20171213 (12 bytes) |
| NULL (8 bytes) | 20171213 (12 bytes) | 20171213 (12 bytes) |
| 20171213 (8 bytes) | NULL (0 bytes) | NULL (0 bytes) |
| NULL (8 bytes) | NULL (0 bytes) | NULL (0 bytes) |
행당 한 번뿐 아니라 4 바이트를 잃습니다. 그러나 null이 아닌 행의 모든 셀에 대해.
에서 - 2008 - 스파 스 열 소개 - SQL 서버에 2 부 에 의해 PINAL 데이브 :
모든 SPARSE 열은 데이터베이스에 하나의 XML 열로 저장됩니다. SPARSE 컬럼의 장점과 단점을 살펴 보겠습니다.
SPARSE 컬럼의 장점은 다음과 같습니다.
INSERT, UPDATE 및 DELETE 문은 이름으로 스파 스 열을 참조 할 수 있습니다. SPARSE 열은 하나의 XML 열로도 작동 할 수 있습니다.
SPARSE 열은 데이터가 행에 채워지는 필터링 된 인덱스를 활용할 수 있습니다.
SPARSE 열은 데이터베이스에 0 또는 null 값이있을 때 많은 데이터베이스 공간을 절약합니다.
SPARSE 컬럼의 단점은 다음과 같습니다.
SPARSE 열에 IDENTITY 또는 ROWGUIDCOL 속성이 없습니다.
SPARSE 열은 text, ntext, image, timestamp, geometry, geography 또는 사용자 정의 데이터 유형에 적용 할 수 없습니다.
SPARSE 열은 기본값, 규칙 또는 계산 된 열을 가질 수 없습니다.
클러스터형 인덱스 또는 고유 한 기본 키 인덱스는 SPARSE 열을 적용 할 수 없습니다. SPARSE 열은 클러스터형 인덱스 키의 일부가 될 수 없습니다.
SPARSE 컬럼을 포함하는 테이블은 일반 8060 바이트 대신 최대 8018 바이트의 크기를 가질 수 있습니다. SPARSE 열을 포함하는 테이블 작업은 일반 열보다 성능이 저하됩니다.
참고 URL : https://stackoverflow.com/questions/1398453/why-when-should-i-use-sparse-column-sql-server-2008
'Program Tip' 카테고리의 다른 글
웹 상대 경로로 돌아가는 절대 경로 (0) | 2020.11.24 |
---|---|
XAML 그리드에서 RowDefinition Height =“10 *”은 무엇을 의미합니까? (0) | 2020.11.24 |
강력하고 "현대적인"Fortran 코드 작성 (0) | 2020.11.24 |
뮤텍스를 보유한 스레드를 확인할 수 있습니까? (0) | 2020.11.24 |
DEFAULT 값없이 null이 아닌 열을 추가 할 수 있습니까? (0) | 2020.11.24 |