파티션 키도 기본 키의 일부 여야합니까?


24

기본 키가 아닌 열을 기준으로 테이블을 분할하고 있습니까? 오늘 파티션 열이 기본 키의 일부 여야하는지에 대한 상충되는 정보를 읽었습니다. 내 직감은 아니요라고 말하지만 100 % 확신 할 수는 없습니다. 그래서 질문은 ...

  1. 파티션 열이 기본 열의 일부 여야합니까? 어느 쪽이나 다른 쪽이 추천됩니까?
  2. 파티션 키에 대한 인덱스를 작성해야합니까, 아니면 DBMS가 자체적으로 자동으로 수행합니까?

답변:


11

전혀.

파티셔닝에 대한 가장 일반적인 시나리오 중 하나는 날짜 필드를 사용하는 것이며, 이는 PK와 전혀 관련이 없습니다.

예를 들어, Orders필드 가있는 테이블이있는 경우 OrderDate의 월과 연도를 기준으로 파티션 할 가능성이 높습니다 OrderDate.

레코드가 만료되어 더 이상 관련이없는 경우 해당 파티션을 아카이브 테이블 또는 데이터베이스로 이동하여 더 이상 처리되지 않도록 할 수 있습니다.

분할은 거의 모든 필드에서 작동하지만 잘 작동하려면 분할 한 필드가 전부는 아니더라도 대부분의 쿼리에 사용되어야합니다. 파티션 키를 포함하지 않으면 본질적으로 여러 테이블 (파티션)을 거치는 비싼 테이블 스캔이 수행됩니다.

편집하다

2 부 에서는 답이 옳지 않다고 생각 합니다. 파티션 키는 행을 넣을 파티션을 결정하는 데 사용되지만 인덱스가 유지되지 않는다고 생각합니다. 백엔드에 통계가있을 수 있습니다.


10
나는 이것이 오래되었다는 것을 알고 있지만 잘못된 길로 인도하여 다른 사람들에게 논평 할 것이라고 생각했습니다. 파티션 기능의 스위치 기능을 사용하려면 파티션 열이 기본 키에 있어야합니다. 기본 키에 없으면 다음과 같은 오류가 발생합니다. Partition columns for a unique index must be a subset of the index key.
Vaccano

나는 @Vaccano에 동의

3

JNK의 답변 외에도 테이블 파티션과 인덱스 파티션 정렬에 대해 설명하는 이 기사 를 읽어야 할 것입니다 .

파티션 구성표가 기본 키의 첫 번째 열을 정확하게 따르는 많은 유형의 시나리오가 있습니다 (예 : 팩트 테이블의 스냅 샷 날짜가 일반적으로 기본 키의 첫 번째 열뿐만 아니라 파티션 열인 데이터웨어 하우스 시나리오).

그러나 PK가 IDENT 또는 다른 대리 키인 OLTP 환경에서도 마찬가지로 임의의 숫자로 파티셔닝하는 것이별로 유용하지 않기 때문에 파티션에이 키를 사용하는 것은 의미가 없습니다. OLTP 시스템에서는 날짜별로 가장 많이 (아마도 PK가 아님) 파티션을 나누는 경향이 있지만 잠재적으로 지역 또는 일부 조직 부서 (대리를 사용하지 않는 경우 PK에있을 수도 있음)로 분류하는 경향이 있습니다.

그러나 요구 사항은 아닙니다.


글쎄, 많은 것들이 요구 사항이 아닙니다. 인덱싱도 필수는 아닙니다! 기능적으로 이해하기 위해서는 후보 키의 선행 열에서 파티셔닝을 수행해야합니다. 그렇지 않으면 앱 아키텍트는 어떻게 테이블을 사용합니까?
srini.venigalla

@ srini.venigalla 일반적인 경우이지만, 또 다른 일반적인 경우 (동일하게?)는 기본 키나 후보 키의 일부가 아닌 것으로 파티션을 나누는 것입니다. 파티셔닝은 종종 보관에 사용되기 때문에 만료 날짜는 좋은 파티션 선택. 그러나 이것이 열쇠의 일부가 될 수 있음을 의미하는 것은 없습니다. 파티셔닝은 매우 일반적인 저급 기능으로, 여기에는 합법적 인 모범 사례가있는 두 가지 뚜렷하고 상충되는 사용 패턴이 있습니다.
Cade Roux

0

기본 키 자체의 일부가 아닌 경우 후보 키의 일부 여야합니다. 아이디어는 분할이 기본 키와 일치해야한다는 것입니다.

PK에 참여하는 것이 바람직합니다. 다른 키가 아닌 경우 PK가 될만큼 충분히 좋습니다.


후보 키에 대해 들어 본 적이 없습니다. Create / Alter 테이블 문에서이를 어떻게 지정합니까?
AngryHacker

후보 키는 기본 키 자격을 갖춘 또 다른 키입니다. 예를 들어 ID는 기본 키입니다. 그러나 같은 테이블에 다른 열이있는 경우. PERSON_ID는 후보 키라는 행을 고유하게 식별 할 수도 있습니다. 두 번째 및 세 번째 정규화 규칙은 모든 후보 키에도 적용되어야합니다.
srini.venigalla

이해했다. 내 질문의 두 번째 부분은 어떻습니까?
AngryHacker

다른 인덱스와 동일합니다. 예 : 구매시 INDEX IX_ProductVendor_VendorID 작성. ProductVendor (BusinessEntityID);
srini.venigalla

4
이것은 절대적으로 맞지 않습니다. PK와 관련이없는 여러 필드에서 파티션을 나눌 수 있습니다 (예 :) OrderDate. 당신의 주장을 뒷받침 할 것이 있습니까?
JNK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.