두 개의 열에 클러스터 된 인덱스 (테이블의 기본 키)가있는 테이블이 있습니다. 다음과 같이 은 정의됩니다SQL 2005에서 클러스터 된 인덱스 (PK)를 변경하는 가장 좋은 방법
ALTER TABLE Table ADD CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED
(
[ColA] ASC,
[ColB] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
내가이 클러스터 된 인덱스 PK를 제거하고 다음과 같은 클러스터 된 인덱스를 추가하고 또한 다음과 같이 클러스터되지 않은 인덱스를 사용하여 기본 키 제약 조건을 추가 할 수 있습니다.
CREATE CLUSTERED INDEX [IX_Clustered] ON [Table]
(
[ColC] ASC,
[ColA] ASC,
[ColD] ASC,
[ColE] ASC,
[ColF] ASC,
[ColG] ASC
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY]
ALTER TABLE Table ADD CONSTRAINT
PK_Table PRIMARY KEY NONCLUSTERED
(
ColA,
ColB
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
은 그냥 PK가, 새로운 클러스터 된 인덱스를 추가 한 다음 클러스터되지 않은 기본 키 인덱스를 추가 인덱스를 클러스터 드롭 가고 있었다, 그러나 나는 기존의 클러스터 된 인덱스를 삭제하기로 테이블 데이터를 일으킬 것이라고 배웠습니다 재정렬해야합니다 (대답은
What happens when I drop a clustered primary key in SQL 2005입니다). 필자는 이것이 필요하다고 생각하지 않습니다. 테이블은 1TB를 노크하고 있으므로 불필요한 재주문을 피하고 싶습니다.
내 질문은 기존 구조에서 원하는 구조로 이동하는 가장 좋은 방법은 무엇입니까?
편집 : 그냥 명확히하고 싶습니다. 테이블은 1TB이고 임시 테이블을 생성 할 여유가 없습니다. 임시 테이블을 만들지 않고이를 수행 할 수있는 방법이 있다면 알려주십시오.
이것은 옵션이 아닙니다. 1.5TB RAID에 1TB 테이블이 있습니다. –
SQL Server에서는 순서 변경 및 이동을 위해 공간이 필요합니다. 공간이 부족한 경우 DROP INDEX에서 MOVE TO 옵션을 사용하여 임시 저장소에 테이블을 만든 다음 RAID에서 다시 작성하십시오. – Quassnoi
행을 청크로 전송하여 이동 중에 소스에서 삭제할 수 있습니다. 그것은 아마도 매우 느린 과정 일 것입니다. –