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


22

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

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

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

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

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

답변:


23

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

  • 먼저 파티션 기능 과 파티션 구성표를 만듭니다
  • 그런 다음 테이블을 분할 할 수 있습니다.
  • 테이블에 클러스터 된 인덱스가있는 경우 올바른 파티션에서 테이블을 삭제하고 다시 작성하거나 DROP_EXISTING절을 사용하여 클러스터 된 인덱스를 다시 작성할 수 있습니다 .
  • 테이블에 클러스터형 인덱스가없는 경우 파티션 구성표를 사용하여 올바른 파티션에 인덱스를 만들 수 있습니다.
  • 또한 Enterprise Edition 은 ONLINE=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.