2011-10-12 4 views
2

테이블에 더 이상 NVARCHAR (256)이 아니고 NVARCHAR (MAX)이되도록 열이 있습니다. 이 작업을 수행하는 명령을 알고 있습니다 (ALTER TABLE ALTER COLUMN NVARCHAR (MAX)). 내 질문은 정말로 혼란에 관한 것입니다. 프로덕션 환경에서이 작업을 수행해야하며 실제 환경에서이 작업을 수행하는 동안 사용자에게 사용상의 어려움이 있을지 궁금합니다. 그 당시 데이터베이스를 사용하고있는 사용자는 부팅 할 수 있습니까? 이 작업이 너무 오래 걸릴 수 있습니까? 백업을하고 가능하면 시간에서 그것을 할 -ALTER TABLE ALTER COLUMN이 (가) 진행중인 db 액세스를 방해합니까?

감사합니다,

Sachin

답변

3

전의 답변이 메타 데이터 변경 일 뿐이며 완전히 다른 결론을 가진 새 답변을 제출하겠다는 주장을 삭제했습니다!

nvarchar(max)으로 변경하는 경우 최대 nvarchar(4000)으로 변경하는 경우에도 마찬가지입니다. 작업은 매우 비싸 보입니다. SQL Server는 새로운 가변 길이 열을 추가하고 이전의 기존 데이터를 복사하므로 시간이 많이 걸리는 차단 작업으로 많은 페이지 분할과 내부 및 논리적 조각화가 발생합니다.

는 아래

다음
CREATE TABLE T 
(
Foo int IDENTITY(1,1) primary key, 
Bar NVARCHAR(256) NULL 
) 

INSERT INTO T (Bar) 
SELECT TOP 4 REPLICATE(CHAR(64 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))),50) 
FROM sys.objects 

ALTER TABLE T ALTER COLUMN Bar NVARCHAR(MAX) NULL 

SQL 서버 내부 뷰어에서 페이지를보고 알 수있다

Screenshot

흰색 41 00 ...는 이전 버전에서 불필요한 공간을 보여줍니다 기둥.

0

조언이 있어야한다.

그렇게 말한 바에 따르면, 나는 데이터베이스가 변경으로 인해 혼란에 빠질 것으로는 기대하지 않으며, 그렇게 오래 걸리지는 않을 것입니다.

클라이언트 소프트웨어는 어떻습니까? 어떻게 영향을받을 것인가?

0

방대한 양의 행 (수백만)이 없으면 괜찮습니다. 예, 업데이트하는 동안 테이블을 잠그지 만 보류중인 요청 만 기다립니다.

1

진행중인 쿼리는 영향을받지 않습니다. 데이터베이스는 변경되기 전에 독점적 인 테이블 잠금을 만들 수있을 때까지 기다려야합니다.

업데이트가 수행되는 동안 쿼리가 테이블을 사용할 수 없으므로 테이블에 많은 레코드가있는 경우 테이블을 사용해야하는 쿼리에는 데이터베이스가 응답하지 않는 것처럼 보입니다.

+0

이것은 데이터 작업 크기가 아닙니다. 표의 행 수는 사안에 영향을 미치지 않습니다. –

+0

@ Martin Smith : 나는 그것에 대해 잘 모르겠습니다 ...'varchar (n)'형식은'varchar (max)'와 동일하지 않습니다. 데이터베이스는 더 긴 일부 값을 테이블 외부에 저장하도록 선택할 수 있습니다. – Guffa

+0

아니면 적어도 나는 그것이 있어야한다고 생각하지 않았지만 테스트는 그것이 (+1)임을 보여주는 것처럼 보입니다. 'ALTER TABLE X ALTER COLUMN Bar NVARCHAR (4000) null'은 즉각적이지만 NVARCHAR (max)는 분명히 없기 때문에 Extents에 많은'U' lock이 있고 꺼내 질 페이지에'X' lock이 많이 있습니다. SQL Server 2008의 내부 문서에서는 'max'데이터 유형의 실제 길이가 '8000'보다 작 으면 'nvarchar (x)'와 동일하게 처리해야합니다. –

관련 문제