varchar 열의 크기를 줄이면 데이터베이스 파일에 어떤 영향을 미칩니 까?


15

데이터베이스 VARCHAR(MAX)에는 VARCHAR(500)(또는 최대보다 훨씬 작은) 열로 충분할 열 이있는 여러 테이블이 있습니다 . 당연히 나는 이것을 정리하고 크기를보다 합리적인 수준으로 낮추고 싶습니다. 내가 이것을 이해하는 '방법': 내 질문은 이 열을 변경하여 디스크의 페이지와 현존하는 사람들에게 무엇을 할 것인가? (열을자를 때 발생하는 일에 대한 정보가 많이 있지만 열을 줄일 때 발생하는 일에 대한 정보를 찾는 데 어려움이 있습니다.)

일부 테이블의 행 수는 매우 적으므로 변경 비용에 대해 걱정하지 않지만 일부는 상당히 크며 잠재적으로 재구성되고 차단 / 다운 타임이 많이 발생하는 것에 대해 걱정하고 있습니다. 실제로는 유지 관리 기간을 추정하는 방법을 원합니다. 일반적으로이 경우 데이터베이스 엔진의 작동 방식을 더 잘 이해하고 싶습니다.

미리 감사드립니다!

편집하다:

내가보고있는 20 개의 테이블이 있지만 그중 절반에만 1,000보다 큰 행 수가 있습니다. 가장 큰 행은 거의 백만 행입니다. 최악의 위반자는 350,000 개의 행과 4 개의 VARCHAR(MAX)열 이있는 테이블 로, VARCHAR(500)레벨로 축소 될 수 있습니다 .

답변:


12

가장 먼저해야 할 일 : 표에 얼마나 많은 데이터가 있습니까? 테이블의 행 수와 크기는?

두 번째 :이 테이블을 테스트 서버에 백업 및 복원하고 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 분이 걸리고 두 번째 VARCHARNVARCHAR데이터 크기의 절반이 되더라도 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 억 행 (또는 그 이상) 테이블을 초 단위로 재구성하십시오. 슬프게! (무료 등록 필요).


2
그래서 최악의 테이블을 로컬 인스턴스에 복사했습니다 (즉, 느린 디스크와 1/3 코어). 나는 ALTER각 칼럼을 연속적으로 편집했다-각 행동은 1 초도 채 걸리지 않았다. 그들이 완료 될 때, 테이블의 크기는 두 배가되었지만, 일단 REBUILD(1 초 미만의 작업이기도 함) 수행하면 테이블은 원래 크기로 돌아갔습니다.
nateirvin

@nateirvin 잘 들었습니다. ALTER TABLE한 번에 모든 필드를 수행하여 각 열을 쉼표로 구분 하여 작업 속도를 높일 수 있습니다 . 트랜잭션이 너무 큰 경우 테이블을 각각 열의 절반에 해당하는 2 개의 ALTER 문으로 분할하십시오. 그리고 테이블이 얼마나 큰지에 따라 두 ALTER 문 각각간에 REBUILD를 수행 할 수도 있습니다. 가지고 놀 것. 또한 작업은 테이블에 대한 모든 액세스를 차단하는 기간 동안 스키마 잠금이 필요할 수 있습니다.
Solomon Rutzky

1
나는 각각 ALTER의 크기 변화를 추적 할 수 있도록 개별적으로 수행했지만 확실히 알고 있습니다. 감사!
nateirvin

1

내가 수집 한 것에서 alter 문을 실행하면 테이블에서 다른 프로세스에 의해 잠겨 있지 않은 한 오래 걸리지 않아야합니다. 그것을 GBN에 따르면 단지 메타 데이터 변경입니다 : /programming/7261909/is-it-bad-to-use-alter-table-to-resize-a-varchar-column-to-a-larger -크기

또한 저장 방법에 대해서는 SQL Server가 전체 페이지를 채울 때까지 varchar 데이터를 8k 페이지에 저장 한 것으로 보이며이 시점에서 포인터로 대체하여 BLOB로 저장합니다.

길이를 변경하면 레코드가 잘리지 않는다고 가정합니다. 그렇다면 최대 varchar (500)로 변환하는 데이터의 길이는 최대 502 바이트 여야하며 포인터가 없어야합니다.

따라서 긴 이야기는 짧지 만 데이터를 자르지 않는 한 크게 바뀌지 않아야합니다.


5
이것은 절대적으로 맞지 않습니다. 실제로 테스트했기 때문에 공감하지는 않을 것입니다 (일부 사람들이하는 것 이상이므로 그렇게 해 주셔서 감사합니다).이를 대규모로 테스트해야합니다. 당신이 연결 한 대답은 크기를 늘리는 것이 아니라 줄이는 것입니다. 그것들은 매우 다른 두 가지 작업입니다.
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.