답변:
테이블을 분할하려면 아래의 간단한 단계를 수행하십시오.
DROP_EXISTING
절을 사용하여 클러스터 된 인덱스를 다시 작성할 수 있습니다 .ONLINE=ON
CREATE INDEX 문의 옵션을 유연하게 사용 하여 응용 프로그램의 중단 시간을 최소화합니다. ONLINE 옵션을 사용하여 인덱스를 재 구축하는 동안 성능이 저하됩니다.파티셔닝을 자동화하기 위해 SQL Server Partition Management 유틸리티 또는 SQL Server Partitioned Table Framework 를 코드 플렉스에서 사용할 수 있습니다.
좋은 자료들 :
테이블에 클러스터형 인덱스가 있는지 여부를 지정하지 않으므로 모든 옵션을 살펴 보겠습니다.
이 예제 파티션 함수, 파티션 구성표 및 테이블을 사용하겠습니다.
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)
위의 대부분의 명령문 에서 절을 사용할 수 있습니다 . 그러면 다른 연결에서도 테이블을 사용할 수 있습니다. 그러나 해당 시간 동안 성능에 영향을 미칩니다.