nvarchar 열의 크기를 변경할 때 고유 인덱스를 삭제해야합니까? 그리고 인덱스를 다시 만들 때 테이블이 잠길까요?


14

우리 데이터베이스에는 다음과 같은 큰 테이블이 있습니다.

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

그러나 이제 직렬 필드의 크기가 작아 졌으므로 32로 변경하고 싶습니다. Visual Studio 스키마 비교 도구는 다음을 수행하여 제안합니다.

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

이것이 정말로 필요한가? 아니면이 작업을 수행하는 매우 안전한 방법입니까?

또한 고유 인덱스를 재 작성할 때 테이블이 잠길 수 있습니까? 다음 유지 관리 기간이 앞으로 몇 달이기 때문에 이것은 테이블에 3 천만 개의 행이 있고 인덱스를 다시 만드는 데 다소 시간이 걸리기 때문에 큰 문제가 될 것입니다. 내 대안은 무엇입니까?

답변:


24

인덱스를 삭제하고 다시 만들 필요가 없습니다.

그냥 사용

ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 

이것은 메타 데이터 전용 변경입니다.

에서 열 NVARCHAR(16)NVARCHAR(32)변경해도 스토리지에는 전혀 영향 을 미치지 않습니다.

(에서 다른 방법 내내가는 NVARCHAR(32)것은 NVARCHAR(16)어쩌면 Visual Studio를 그냥 항상이되어 있는지 여부를 확인하는 대신에 그 보일러 플레이트 코드를 생성하지만) 당신에게 컬럼에 의존 객체에 대한 오류를 줄 것이다 실제로 이 필요합니다.


2
Visual Studio에서 왜 DROP / CREATE INDEX로 스크립트를 작성하는지 궁금합니다. 아마도 불필요하고 CYA 일 것입니다.
Aaron Bertrand

2
@AaronBertrand-필요하지 않은 경우 최적화가 누락 된 것으로 가정합니다. 온라인 서적은 이 업데이트가
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.