작은 테이블의 클러스터형 columnstore 인덱스

Nov 23 2020

일반적으로 클러스터형 열 저장소 인덱싱 된 테이블은 큰 테이블에 유용합니다. 백만 개의 행이 이상적입니다. 또한 이러한 테이블에서 사용 가능한 열의 하위 집합 만 선택하는 쿼리에도 유용합니다.

이 두 가지 "규칙"/ 모범 사례를 위반하면 어떻게됩니까?

  1. 최대 수천 또는 수십만 행만 저장하는 클러스터형 열 저장소 인덱싱 된 테이블을 갖는 것과 같습니다.
  2. 그리고 모든 열이 필요한 클러스터 된 열 저장소 테이블에 대해 쿼리를 실행합니다.

내 테스트는 행 저장된 클러스터형 인덱스 테이블과 비교하여 성능 저하를 나타내지 않습니다. 우리의 경우 대단합니다.

이 두 가지 규칙을 위반하는 "장기적"효과가 있습니까? 아니면 아직 나타나지 않은 숨겨진 함정이 있습니까?

필요한 이유 : 여러 공급 업체 데이터베이스의 여러 인스턴스에 사용될 데이터베이스 모델을 설계했습니다. 스키마는 모든 데이터베이스에서 동일하게 유지되지만 공급 업체마다 데이터 양이 다릅니다. 따라서 소규모 공급 업체는 테이블에 소량의 데이터 (1000000 미만)를 넣을 수 있습니다. 행-저장 및 열-저장 모델에 대해 두 개의 다른 데이터베이스를 유지하는 것을 허용 할 수 없습니다.

답변

3 J.D. Nov 24 2020 at 00:20

@YunusUYANIK가 한쪽에 만 적용되는 스키마 설계의 잠재적 인 단점을 지적하기 위해 두 시나리오에 모두 적합한 테이블에 rowstore 및 columnstore 인덱스를 모두 생성하지 않는 이유는 무엇입니까? 물론 동일한 필드를 두 가지 방법으로 인덱싱 할 수 있지만 주요 단점은 일반적으로 성능을 계획 할 때 훨씬 덜 염려되는 스토리지 공간 사용이 증가한다는 것입니다.

스키마와 각 공급 업체에 대한 테이블의 데이터 양에 따라 다르므로 공급 업체 조건 자에 따라 다양한 양의 데이터에 대한 적절한 쿼리에서 인덱스 디자인이 사용되고 있는지 테스트해야합니다. . 최악의 경우에는 가끔 인덱스 힌트를 사용해야 할 수도 있지만 두 가지 유형의 인덱스를 모두 올바르게 설계하면 그럴 가능성이별로 없다고 생각합니다.

4 YunusUYANIK Nov 23 2020 at 22:16

Columnstore 인덱스는 데이터 크기 압축에 큰 이점이 있습니다. Columnstore 인덱스의 일반적인 목적은 압축으로 인해 많은 데이터를 빠르게 읽는 것입니다.

CCI 는 Columnstore Clustered Index, Clustered 는 Clustered Index입니다.

Columnstore Index는 데이터 크기를 4MB에서 2MB로 압축합니다.

성능을 두 개의 테이블과 세 부분으로 볼 수 있습니다.

첫 번째는 최소 SELECT작업입니다.

SELECT * FROM Users_CCI WITH(INDEX=CCI_Users) WHERE Id=12333

SELECT * FROM Users_Clustered WHERE Id=12333

결과 : Columnstore Scan여기와 잘못된 추정이 있습니다. 또한 논리적 읽기 차이. 중요하지 않다고 말할 수 있지만 최소한의 SELECT 쿼리를 사용하는 경우 수천 번 사용하십시오. 그리고 전체 성능에 영향을 미칩니다.

두 번째는 최소 UPDATE작업입니다.

UPDATE Users_CCI SET Age=10 WHERE  Id=2

UPDATE Users_Clustered SET Age=10 WHERE  Id=2

결과 : 우리가 볼 수 있듯이 읽기, CPU 및 시간 차이가 있습니다.

세 번째는 REBUILD작업입니다.

USE [StackOverflow2013]
GO
ALTER INDEX [CCI_Users] ON [dbo].[Users_CCI] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE)
GO
USE [StackOverflow2013]
GO
ALTER INDEX [PK_Users_Clustered_Id] ON [dbo].[Users_Clustered] REBUILD PARTITION = ALL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

UPDATE Users_CCI SET Age=10 
UPDATE Users_Clustered SET Age=10 

인덱스 조각화를 위해 모든 행을 다시 작성하고 업데이트하면 클러스터형 인덱스보다 더 조각난 클러스터형 Columnstore 인덱스가 표시됩니다. 그리고 나는 보여주지 않았지만 Clustered Columnstore IndexRebuild 프로세스는 트랜잭션 로그를 Clustered Index.

등의 문서를 말한다

  • 테이블 작업의 10 % 이상이 업데이트 및 삭제입니다. 많은 수의 업데이트 및 삭제로 인해 조각화가 발생합니다. 조각화는 모든 데이터를 columnstore에 강제로 넣고 조각화를 제거하는 reorganize라는 작업을 실행할 때까지 압축률 및 쿼리 성능에 영향을줍니다. 자세한 내용은 columnstore 인덱스에서 인덱스 조각화 최소화를 참조하세요.

작은 테이블이있는 경우 Columnstore 인덱싱 할 필요가 없습니다.