큰 데이터 집합을 처리하기 위해 SQL Server 2008 R2에 대한 샤딩을 설정하기위한 패턴은 무엇입니까? 10 억 행)를

SQL Server 2008 R2에서 큰 데이터 세트 (> 10 억 행)를 처리하고 싶습니다. “샤딩”또는 “수평 파티셔닝”을 설정하면 테이블을 여러 파일로 나눌 때 큰 데이터 세트를 더 빨리 처리 할 수 ​​있다고 들었습니다.

샤딩 또는 수평 파티셔닝을 사용한 적이 있습니까? 그렇다면 경험상 단일 단일 테이블에 비해 더 나은 결과를 얻을 수있는 패턴을 제안 할 수 있습니까?



답변

첫째, 일반 상품 서버 하드웨어의 파티션 된 아키텍처로 10 억 개의 행을 효과적으로 처리 할 수 ​​있습니다. 이국적인 데이터 공유 아키텍처는이 데이터 볼륨에 필요하지 않지만 테이블 파티셔닝으로 큰 이점을 얻을 수 있습니다.

샤딩은 수평 분할과는 다른 것으로, 대부분의 SQL Server 버전 1에서 지원하지 않는 ‘공유 없음’아키텍처를 의미합니다.

SQL Server는 수평 파티셔닝을 지원할 수 있으며 공유 디스크 아키텍처는 ~ 1 억 행에 적합합니다.

SQL Server에서 파티션 생성 함수는 테이블의 열에있는 값 또는 값 범위를 기반으로 파티션을 선택합니다. 예 :

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go

그런 다음 파티션을 할당 할 파일 그룹을 하나 이상 만듭니다. 큰 데이터 세트의 경우 이러한 파일 그룹을 다른 물리적 볼륨에 설정할 수 있습니다. 거의 모든 경우에 직접 연결 스토리지는 SAN보다 훨씬 빠릅니다. 아래 예에서는 PartVol1-PartVol6이라는 6 개의 파일 그룹을 만들었습니다.

파티션 함수의 값에 따라 파일 그룹에 테이블 파티션을 할당하기 위해 하나 이상의 파티션 구성표를 작성할 수 있습니다. 예 :

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go

이 체계는 회계 기간에 분할되도록 설계되었습니다. 키를 사용할 수는 있지만 날짜도 자주 사용됩니다.

파티션 구성표에서 파일 그룹 인 것처럼 테이블을 만들 수 있습니다 (예 :

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go

테이블은 지정된 파일 그룹 대신 파티션 구성표에 작성되며이 절은 파티션 키로 사용될 열을 지정합니다. 파티션 키를 기반으로 테이블의 행이 파티션 구성표의 파일 그룹 중 하나에 할당됩니다.

참고 : 파티셔닝 구성표를 설계 할 때 일반적으로 각 파티션의 행 수는 행 너비에 따라 천만에서 천만 사이에 있어야합니다. 파티션이있는 디스크 볼륨은 몇 초 안에 하나 이상의 파티션을 스캔 할 수있을 정도로 빠릅니다.

파티셔닝, 샤딩 및 공유 시스템 없음

이 주제에 대한 논의를 명확하게하기 위해 약간의 용어가 사용됩니다.

  • ‘공유 없음’시스템은 노드에 공유 SAN 스토리지가 없지만 노드에 로컬 스토리지를 사용하는 병렬 시스템입니다. 이러한 유형의 아키텍처의 전형적인 예는 Teradata입니다. 공유 된 시스템은 중앙 I / O 병목 현상이 없으므로 매우 큰 데이터 세트로 확장 할 수 없습니다. I / O 처리량은 시스템의 노드 수에 따라 확장됩니다.

  • ‘공유 디스크’시스템은 하나 이상의 데이터베이스 서버가 단일 디스크 스토리지 서브 시스템을 공유하는 시스템입니다. 데이터베이스는 로컬 스토리지가 있거나 SAN에 연결된 단일 서버이거나 공유 SAN에 연결된 서버 클러스터 일 수 있습니다. 이 유형의 시스템은 스토리지 서브 시스템에서 사용 가능한 처리량에 의해 제한됩니다.

  • ‘샤딩’은 공유 없음 아키텍처에서 여러 물리적 서버간에 데이터베이스를 분할하는 것을 설명하는 데 사용되는 용어입니다. 다양한 플랫폼에서 샤드 데이터베이스에 대한 지원이 크거나 적습니다. Teradata 서클에서는 물리적 아키텍처가 공유 유형이 아니더라도 Teradata가 클라이언트에게 투명한 단일 시스템 이미지를 제공하므로이 용어는 사용되지 않습니다.

    이전 버전의 SQL Server는 분산 파티션 뷰를 통한 샤딩을 제한적으로 지원합니다. Microsoft는 이제 단일 시스템 이미지로 무 공유 아키텍처를 지원하는 SQL Server 2008 R2 버전을 만들지 만이 버전은 OEM 만 사용할 수 있으며 하드웨어 번들로만 구입할 수 있습니다.

10 억 행

10 억 행의 경우 (개별 행이 매우 넓지 않은 경우) 공유 된 것이 없거나 샤드 된 아키텍처는 편안하게 오버 킬 영역에 있습니다. 이 유형의 볼륨은 디스크 서브 시스템이 충분히 빠른 경우 적절한 스펙의 단일 서버에서 처리 할 수 ​​있습니다.

로컬 직접 연결 디스크는 성능 가격 측면에서 가장 비용 효율적입니다. 단일 SAS RAID 컨트롤러는 여러 어레이를 사용할 수 있으며 서버에 여러 컨트롤러를 설치할 수 있습니다. 구성에 따라 최신 24-25 슬롯 SAS 어레이는 스트리밍 성능에서 수천 IOPS 또는 1GB + / 초를 통과 할 수 있습니다. 여러 개의 PCI-e 버스와 여러 개의 컨트롤러가있는 서버는 이론적으로 더 많은 것을 처리 할 수 ​​있습니다.

10 억 행 데이터베이스와 함께 작동하기 위해 필요한 성능 유형은 상용 서버 하드웨어 및이 유형의 직접 연결 스토리지를 사용하여 매우 쉽고 저렴하게 달성 할 수 있습니다. SAN도 사용할 수 있지만 동등한 성능을 얻으려면 여러 개의 SAN 컨트롤러가 필요할 수 있으며 하드웨어 가격이 훨씬 비쌉니다.

일반적으로 권장되는 가동 시간이 필요하지 않은 경우 I / O 요구 사항이 많은 응용 프로그램에는 직접 연결 저장소를 사용하십시오. 구성 및 변경 제어 오류는 최신 데이터 센터 운영 체제의 하드웨어 오류보다 훨씬 더 많은 예정되지 않은 다운 타임 소스입니다.

SAN은 광범위한 중앙 집중식 스토리지 관리 기능을 제공하는 광범위한 애플리케이션 포트폴리오가있는 경우보다 관리하기 쉬운 스토리지 플랫폼을 제공 할 수 있습니다. 그러나 이는 가격이 매우 비싸기 때문에 SAN 기반 인프라에서 고성능을 얻는 것은 어렵고 비용이 많이 듭니다.

1 Microsoft는 병렬 버전의 SQL Server를 만들지 만 하드웨어와 함께 제공되는 OEM 채널을 통해서만 사용할 수 있습니다. 기성품으로 제공되는 버전은이 기능을 지원하지 않습니다.


답변