가장 먼저해야 할 일 : 표에 얼마나 많은 데이터가 있습니까? 테이블의 행 수와 크기는?
두 번째 :이 테이블을 테스트 서버에 백업 및 복원하고 alter 문을 실행하여 영향을 볼 수 있습니까 (테이블이 너무 커서 생산 시스템이 아닌 시스템에 맞지 않아 실행 불가능한 경우)? 항상 내 환경에서의 테스트가 인터 웹의 조언보다 더 정확하다는 것을 알았습니다. 결과에 영향을 줄 수있는 요소가 결과에 영향을 줄 수 있다는 사실을 알지 못하여 결과에 영향을 줄 수있는 몇 가지 요소가 있기 때문입니다.
셋째, 증가하는 가변 길이 필드의 크기를 되어 실제 데이터가 이러한 작업에 변경되지 않을 것이기 때문에 간단한 메타 데이터 작업을 (당신을 통해 8060 바이트 제한하지 않는 가정). 하지만, 다른 한편으로, 감소 가변 길이 필드의 크기를, 심지어 더 분명 작품보다 무언가에 없는 모든 행을 검색하기 전에 SQL Server를 모르기 때문에 단순한 메타 데이터 변경, 새로 요청한 크기가 유효합니다.
따라서 : 예, 일정 기간 동안 테이블이 잠 깁니다 . 시간이 얼마나 되나요? 글쎄, 여기 방금 한 테스트가 있습니다.
다른 테스트에서 단일 INT NOT NULL
필드와 백만 개의 행이 있는 테이블이 있었습니다. 이 테스트를 수행하기 위해 새 테이블에 복사했습니다.
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
이 방법으로 필자는 MAX
필드 를 변경하는 비슷한 시나리오로 시작했습니다 (방금 당신이 가지고 VARCHAR
있고 사용 NVARCHAR
하고 있음을 알았지 만 현재보고있는 동작을 변경해서는 안됩니다) 500
. 또한 500 자 이내로 쉽게 들어갈 수있는 데이터가 있습니다. 몇 분이 걸렸습니다.
나는 다음을 달렸다.
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
그리고 그것은 단지 11 분 이상 걸렸습니다.
나는 단지 다시 테스트를 다시 실행했다. 이번에는 [ResizeTest]
테이블을 삭제하고 두 가지 NVARCHAR
를 그대로 변경 했다. 단지 VARCHAR
사과처럼 보이는 사과와 사과를 비교하고 있다는 것을 확신하기 위해 ;-).
초기 테이블 작성에는 20 초가 ALTER TABLE
걸리고 2 분이 걸렸습니다.
따라서 가동 중지 시간을 예측할 때 데이터 파일 및 / 또는 트랜잭션 로그에서 자동 증가 작업을 수행해야하는지 여부에 관계없이 디스크 I / O 속도를 기반으로하기 때문에 실제로 수행하기가 어렵습니다. 아마도 첫 번째 테스트를 변경하는 데 11 분이 걸리고 두 번째 VARCHAR
는 NVARCHAR
데이터 크기의 절반이 되더라도 2 분 밖에 걸리지 않은 이유 중 큰 부분 일 것입니다 (즉, 파일은 그 시점에서 미리 자랐습니다). 그러나 여전히 테스트는 가장 빠른 디스크가 아닌 랩톱에서 실행되고 있음에도 불구하고 2 개의 작은 열 (행당 22 바이트 정도)의 백만 행이었습니다.
그리고 당신은 데이터 페이지에 무엇을 할 것인지 물었으므로 여기에 당신의 대답이 있습니다. 나는 sp_spaceused
테이블을 만든 후 ALTER COLUMN
,을 한 후에,을 한 후에했다 ALTER TABLE dbo.ResizeTest REBUILD;
. 결과 (다음 숫자는을 사용한 VARCHAR
첫 번째 테스트가 아니라을 사용한 두 번째 테스트를 기반으로 함 NVARCHAR
) :
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
가능한 한 가장 짧은 시간 내에 작업을 유지해야하는 것에 대해 걱정이된다면, 그 작업에 대해 쓴 기사를 확인하십시오. 1 억 행 (또는 그 이상) 테이블을 초 단위로 재구성하십시오. 슬프게! (무료 등록 필요).
ALTER
각 칼럼을 연속적으로 편집했다-각 행동은 1 초도 채 걸리지 않았다. 그들이 완료 될 때, 테이블의 크기는 두 배가되었지만, 일단REBUILD
(1 초 미만의 작업이기도 함) 수행하면 테이블은 원래 크기로 돌아갔습니다.