Program Tip

왜 SPARSE COLUMN을 사용해야합니까?

programtip 2020. 11. 24. 19:25
반응형

왜 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

반응형