SQL Server 파티션-파티션 키에 무엇을 사용해야합니까?


10

SQL Server 파티션 작업을 한 적이 없지만 현재 볼륨이 보증하는 데이터베이스를 설계하는 데 직면했습니다. 이 시스템은 쿠폰 용입니다. 쿠폰은 정기적으로 발행되며, 일반적으로 6 주마다 발행됩니다 (예 : 특별 행사 등). 1,500 만 명의 고객이 있으며 각 발행 이벤트마다 6 개의 서로 다른 쿠폰 유형이 제공되므로 총 9 천만 개의 쿠폰 인스턴스가 제공됩니다. 쿠폰 인스턴스 상환 데이터를 추적하고이를 6 개월 동안 유지해야하지만 일반적으로 쿠폰은 6 주 동안 만 유효합니다. 유효하지 않은 쿠폰에 대한 상환 요청은 POS까지 확인되므로 데이터베이스에 도달하지 않습니다.

6 개월 동안 쿠폰 인스턴스 테이블에 3 억 6 천만 개의 행을 저장하고 구속 테이블에 최대 2 억 7 천만 (최대 20 %의 상환율을 가정)을 저장해야합니다. 이 숫자가 단일 파티션에 비해 너무 크다는 느낌이 듭니까?

내 질문은-파티션 키로 무엇을 사용해야합니까? 명백한 후보 중 하나는 발행 이벤트에 의한 것으로 약 6 개의 파티션을 제공합니다. 그렇다면 파티션 크기가 너무 커서 최적의 성능을 발휘할 수 없을 것이라고 생각합니다. 발급 이벤트 + 고객 ID의 마지막 숫자와 같이 두 개의 키로 분할 할 수 있습니까? 따라서 논리는 다음과 같습니다.

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

또한 필요한 데이터베이스 서버의 사양을 잘 모르겠습니다. 16GB 및 8CPU면 충분합니까? db는 0.5 초 이내에 숫자 바코드 값을 사용하여 쿠폰 인스턴스 테이블의 결과를 반환 할 수 있어야합니다. 유효성 검사 (선택) 및 교환 (삽입)에 대한 예상 트랜잭션 요청은 분당 약 3,500 개로 정점에 도달 할 것으로 예상됩니다.

SQL Server 2008r2 64 비트 db 서버는 고성능 및 대용량 SAN에 액세스 할 수있는 매우 강력한 호스트에서 VM으로 제공됩니다.

비슷한 볼륨을 관리하기 위해 SQL Server 솔루션을 배포 한 사람들의 조언에 매우 감사드립니다.

문안 인사


2
귀하의 테이블은 여전히 ​​작습니다-파티션이 필요하지 않습니다. 파티션이없는 수십억 개의 행이있는 테이블이 있습니다. 그러나 파티션은 FAST DROP에 적합합니다.
TomTom

1
말도 안되는 @TomTom, 분할은 행 수에서 이것의 일부에 도움이 될 수 있습니다. 파티션 구성표는 성능 향상을 실현하기 위해 액세스 패턴에 도움이되어야하지만이 크기의 "필요 없음"담요는 잘못되었습니다.
Mark Storey-Smith

1
아뇨, 맞습니다. 필요합니다! = 혜택. 파티션없이 쿼리를 수행하는 데 문제가 발생할 때 필요합니다.
TomTom

1
이봐 @TomTom 나는 당신이 작은 공격 친구가 필요하다고 생각합니다, 그것은 실제로 공격적이지 않더라도 조금 강합니다. 마크 StoreySmith, 담요 "필요"와 I가 동의하지만이 있다는 귀하의 주장, 일반 잘못 아마 필요하지가 올바른지. 인덱싱 문제라고 생각합니다. 또한 Mark가 필요 대 혜택의 의미를 알고 있음을 알고 있습니다. 우리 모두 좀 느슨하게 잘라 카페인을 끊어 (그리고 나를 믿으십시오. 나는 며칠 동안, 특히 오늘 등 허리 통증
치료제가

답변:


14

서버 사양 질문은 Serverfault 또는 DBA.SE로 보내야합니다.

분할 질문에 대해서는 반드시 분할해야한다고 생각하지 않습니다.

360m 행은 많지만 다루기 쉽지 않습니다.

어떤 상황에서도 필드의 마지막 숫자를 기준으로 분할 하지 마십시오 . 나는 이것이 효과가 있을지 확신하지 못하지만 SARGable이 아니기 때문에 tenable 할 수는 없습니다.

숫자 키를 기준으로 단일 행 탐색 만 수행하면 분할이 도움이되지 않습니다.

파티션 라우트를 추구하기로 결정한 경우 엔진이 확인할 파티션을 알 수 있도록 모든 쿼리에 파티션 키를 포함시키는 것이 효과적임을 명심하십시오. 그렇지 않으면 모두 확인하고 실제로 성능이 저하됩니다.



나도 동의한다. 때로는 더 나은 색인이 필요합니다.
jcolebrand

@JNK에 동의하지 않습니다. 파티션 제거로 혜택을받는 숫자 키를 기반으로하는 단일 행 탐색은 IO를 줄이는 것입니다. 액세스 패턴이 자주 액세스하는 파티션이 자주 액세스하지 않는 파티션보다 버퍼 풀에 남아있는 경우 성능상의 이점이 있습니다. 그리고 파티셔닝이 제공하는 내가 가장 좋아하는 기능, 부분적인 가용성에 대해서는 다루지 않았습니다.
Mark Storey-Smith

기록을 위해, 다른 관점에서 나는 전심으로 동의합니다 :)
Mark Storey-Smith

@ MarkStorey-Smith-그의 열쇠에 달려 있습니다. 현재 OP에 정의 된대로 파티션은 값을 추가하지 않습니다. 또한 날짜 필드 또는 "일반"파티션 구성표와 함께 두 부분으로 된 키를 사용할 수없는 것처럼 들립니다.
JNK

5

지속 계산 열을 사용하는 경우 여러 키를 분할 할 수 있습니다. 그러나 다른 사람들이 말했듯이 파티셔닝은 모든 상황에서 작동하지 않습니다. 구체적인 조언을 제공 할만큼 귀하의 시나리오를 이해하고 있는지 잘 모르겠지만 다음은 일반적인 지침입니다.

  • 파티셔닝은 파티셔닝 키가 SQL 문의 일부인 경우 옵티마이 저가 파티션 배제를 호출 할 수 있도록 데이터를 읽는 데 유용합니다. 선택한 키가 대부분의 쿼리에 유용한 지 확인해야합니다.

  • 좋은 파티셔닝 전략의 한 가지 이점은 데이터를 노화시키는 것입니다. 예를 들어, 파티션 키가 날짜 기반 (예 : 연도)이고 특정 날짜보다 오래된 모든 데이터를 제거하려는 경우 해당 분할을 빈 테이블로 전환하고 자르는 것이 매우 쉽습니다.


4

요구 사항을 좀 더 명확하게 정의해야합니다. 6 개월 동안 약 3 억 6 천만 행이 있다고 언급했습니다. 2 년 후에는 어떻습니까? 현재 성장하고있는 속도로만 성장하고 있습니까? 아니면 기하 급수적으로 성장할 가능성이 있습니까? 이 테이블의 데이터를 영원히 유지 하시겠습니까? 또는 정기적으로 데이터를 보관하고 싶을 수도 있습니다.

데이터 보관에 파티션을 사용할 수 있습니다. 슬라이딩 윈도우 시나리오를 참조하십시오. 이 참조 백서이 하나 .

분할을 사용하여 인덱스 조각화를 관리 할 수도 있습니다. 특정 파티션을 재 구축 / 재구성 할 수 있습니다.

또한 분할 된 테이블이 아닌 분할 된 뷰를 고려해야합니다. 파티션 된 뷰에는 SQL Server Enterprise 라이센스가 필요하지 않습니다. 분할 된 뷰를 사용하면 특정 "파티션"에서 온라인 인덱스 재 구축을 수행 할 수도 있습니다.

재해 복구 계획을 수행 할 때 파티션을 고려할 수도 있습니다. 부분 데이터베이스 복구에 사용할 수 있습니다. 예를 들어, 이전 파티션을 기본 / 현재 파티션과 다른 파일 그룹에 둘 수 있습니다. 그런 다음 복구 할 때 기본 파일 그룹을 복구 한 다음 현재 파티션이있는 파일 그룹을 복구 한 다음 마지막 파티션이있는 파일 그룹을 복원 할 수 있습니다. 이렇게하면 응용 프로그램을 중단해야하는 시간을 줄일 수 있습니다.

분할에 관한 Kimberly Tripp 의이 훌륭한 비디오를 확인하십시오 .


6 개월 동안 만 데이터를 보관하면됩니다. 매주 우리는 6 개월 이상 전에 발행 된 쿠폰을 삭제하는 하우스 키핑 작업을 운영 할 것입니다.
Rob Bowman

3
따라서 기본적으로 매주 약 1,500 만 행을 삭제 / 제거해야합니다. 테이블이 얼마나 넓습니까? 날짜 열별로 테이블을 분할하는 것이 좋습니다. 이렇게하면 매주 삭제가 간단한 메타 작업이됩니다. 주 파티션 된 테이블에서 가장 오래된 파티션을 준비 테이블로 전환하면됩니다. 그런 다음 준비 테이블을 삭제하십시오. 이것을 슬라이딩 윈도우 시나리오라고합니다. 내가 이것을 게시하는 방법을 게시 한 첫 번째 백서를 찾아보십시오.
Dharmendar Kumar '

-2

오래된 데이터를 아카이브하여 파티셔닝을 수행하지 않는 한 잘못된 이유로 수행하는 것이 아니므로 그렇게하지 않아야합니다.


2
아카이빙 외에 파티셔닝을 사용해야하는 많은 이유가 있습니다. 파티션 제외는 올바르게 사용하는 경우 여러 유형의 쿼리에 큰 이점이 있습니다.
스튜어트 Ainsworth

Stuart에 동의합니다. 이것은 다소 나쁜 조언입니다.
jcolebrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.