기존의 파티션되지 않은 테이블을 파티션하는 방법


22

데이터가있는 기존 테이블이 있습니다.

dbo.Test (col1,col2,col3....) ON [PRIMARY]

이 테이블을 다음과 같이 파티션으로 변경해야합니다.

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

테이블을 삭제하거나 다시 만들지 않고 어떻게 이것을 달성 할 수 있습니까?

답변:


23

테이블을 분할하려면 아래의 간단한 단계를 수행하십시오.

  • 먼저 파티션 기능파티션 구성표를 만듭니다
  • 그런 다음 테이블을 분할 할 수 있습니다.
  • 테이블에 클러스터 된 인덱스가있는 경우 올바른 파티션에서 테이블을 삭제하고 다시 작성하거나 DROP_EXISTING절을 사용하여 클러스터 된 인덱스를 다시 작성할 수 있습니다 .
  • 테이블에 클러스터형 인덱스가없는 경우 파티션 구성표를 사용하여 올바른 파티션에 인덱스를 만들 수 있습니다.
  • 또한 Enterprise EditionONLINE=ONCREATE INDEX 문의 옵션을 유연하게 사용 하여 응용 프로그램의 중단 시간을 최소화합니다. ONLINE 옵션을 사용하여 인덱스를 재 구축하는 동안 성능이 저하됩니다.

파티셔닝을 자동화하기 위해 SQL Server Partition Management 유틸리티 또는 SQL Server Partitioned Table Framework 를 코드 플렉스에서 사용할 수 있습니다.

좋은 자료들 :


53

테이블에 클러스터형 인덱스가 있는지 여부를 지정하지 않으므로 모든 옵션을 살펴 보겠습니다.

이 예제 파티션 함수, 파티션 구성표 및 테이블을 사용하겠습니다.

CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
GO
CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
GO

1. 테이블에 제약 조건에 의해 생성되지 않은 클러스터형 인덱스가 있습니다.

가장 쉬운 경우입니다. 절 CREATE INDEX과 함께 명령문을 사용 DROP_EXISTING하여 테이블을 파티션 구성표로 이동할 수 있습니다 .

이 클러스터 된 인덱스가 작성된 예를 가정하십시오.

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];

이 테이블을 분할하기 위해 클러스터형 인덱스는 파티션 열 (이 경우에는 pt)을 키의 일부로 포함합니다. 이 명령문은 클러스터 된 인덱스를 변경하여 파티션 컬럼을 포함하고 동시에 파티션 컬럼을 분할합니다.

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

DROP_Existing절은 새 색인을 작성하기 전에 기존 색인을 자동으로 제거합니다. DROP INDEX비 클러스터형 인덱스는 한 번만 다시 작성하므로 별도의 방법보다 선호 됩니다.

2. 테이블에 PRIMARY KEY또는 UNIQUE제약 조건의 일부인 클러스터형 인덱스가 있으며 키의 일부로 파티션 열이 포함되어 있습니다.

이것은 여전히 ​​쉽고 이전과 매우 유사합니다.

PRIMARY KEY제한 조건이 테이블에서 작성 되었다고 가정하십시오 .

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];

이제 1에서 사용한 것과 동일한 재생성 스크립트를 실행할 수 있습니다.

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

3. 테이블에 파티션 열을 포함하지 않지만 클러스터 된 인덱스가 있지만 PRIMARY KEY또는 UNIQUE제약 조건의 일부로 생성되었습니다.

힘든 행운. 사실 이후에 PRIMARY KEY또는 UNIQUE제한 조건 의 정의를 변경할 수 없습니다 . 유일한 옵션은 제약 조건을 삭제 한 다음 파티션 열을 포함하여 제약 조건을 다시 만들거나 파티션 열이 포함 된 제약 조건과 무관하게 클러스터형 인덱스를 만드는 것입니다. 두 번째 경우 NONCLUSTERED에는 파티션 열을 포함하지 않고 제약 조건 을 다시 만들 수 있습니다 . 이제이 제한 조건이 정렬되지 않았기 때문에 (지원 인덱스가 분할되지 않았 음을 의미) 디스크에서 배치 할 위치를 지정해야합니다.

테이블에 다음과 같은 기본 키가 있다고 가정하십시오.

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];

이 테이블을 분할하려면 먼저 제약 조건을 삭제해야합니다.

ALTER TABLE dbo.pt DROP CONSTRAINT ptc;

그런 다음 파티션 된 클러스터형 인덱스를 작성해야합니다.

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

PRIMARY KEY정렬되지 않은 구속 조건 을 다시 작성하도록 선택하면 다음 과 같이 수행 할 수 있습니다.

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

4. 테이블에 클러스터 된 인덱스가 없습니다

이 경우 대부분의 경우 파티션을 설정하기 위해 클러스터 된 인덱스를 작성하는 것이 좋습니다. 앞에서 본 create index 문을 사용할 수 있습니다.

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

그러나 클러스터형 인덱스를 만들지 않는 충분한 이유가있는 경우 다음 2 단계 접근 방식으로 벗어날 수 있습니다. 안타깝게도이 변경 작업을 수행 할 수있는 직접적인 방법은 없습니다.

테이블에 클러스터 된 인덱스가 없다고 가정하십시오. 테이블을 분할하려면 먼저 CLUSTERED UNIQUE제약 조건을 만들어야합니다 . CLUSTERED PRIMARY KEY제약 조건을 사용할 수도 있습니다 . 고유 한 열 조합이있는 경우 간단한 단계입니다.

ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);

제한 조건이 작성된 후 다시 삭제하고 테이블을 새 파티션 구성표로 "이동"할 수 있습니다.

ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));

고유 한 열 조합이 없으면 운이 좋지 않습니다. 이 경우 유일한 옵션은 새 열을 추가하고 고유 한 값으로 채우는 것입니다. 테이블이 상당히 작은 경우 다음과 같이 할 수 있습니다.

ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);

그러나 모든 행이 평가 될 때까지 독점 테이블 잠금이 필요합니다. 테이블 크기에 따라 꽤 오랜 시간이 걸릴 수 있습니다. 해당 열이 생성되면 위의 두 단계를 따라 먼저 UNIQUE구속 조건을 생성 한 다음 바로 다시 삭제하십시오. 나중에 열을 다시 삭제할 수도 있습니다. 이 모든 단계는 상당히 방해가되지 않으므로 테이블에 클러스터형 인덱스를 만드는 것이 좋습니다. 그것은 독특 할 필요조차 없습니다.


Enterprise Edition이있는 경우 WITH(ONLINE=ON)위의 대부분의 명령문 에서 절을 사용할 수 있습니다 . 그러면 다른 연결에서도 테이블을 사용할 수 있습니다. 그러나 해당 시간 동안 성능에 영향을 미칩니다.


1
사 바스티안! 그냥 뛰어나다! 위의 # 3에 추가하기 만하면 ... SWITCH를 사용하거나 사용하지 않으려면 모든 색인을 정렬해야합니다. 클러스터되지 않은 정렬되지 않은 PK를 만들면 먼저 인덱스를 삭제하는 단계를 수행하고 SWITCH (방향에 관계없이)를 수행하고 인덱스를 다시 작성하지 않는 한 SWITCH를 수행 할 수 없습니다. 그것은 종종 삭제와 동등한 작업을 수행하는 것보다 훨씬 빠르며 물론 SWITCH를 사용할 필요가 없다면 문제가되지 않습니다.
Jeff Moden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.