데이터 유형 변경에서 성장한 SQL Server 테이블의 크기를 줄이는 방법

StackOverflow https://stackoverflow.com/questions/807579

문제

SQL Server 2005의 크기는 약 4GB 인 테이블이 있습니다.

(약 1,700 만 레코드)

데이터 유형에서 필드 중 하나를 변경했습니다 char(30) 에게 char(60) (총 25 개의 필드가 있습니다. char(10) 숯불 공간의 양은 약 300 명까지 추가됩니다)

이로 인해 테이블의 크기가 두 배가되었습니다 (9GB 이상)

그런 다음 char(60) 에게 varchar(60) 그런 다음 데이터에서 추가 공백을 잘라내는 기능을 실행했습니다 (현장의 데이터의 평균 길이를 약 15로 줄이기 위해).

이것은 테이블 크기를 줄이지 않았습니다. 데이터베이스 축소도 도움이되지 않았습니다.

실제로 테이블 구조를 재현하고 데이터를 복사하지 않아도 (1,700 만 레코드입니다!) 크기를 다시 줄이는 데 덜 과감한 방법이 있습니까?

도움이 되었습니까?

해결책

당신이 공간을 돌려주지 않는 것이 분명합니다! :-)

텍스트 필드를 Char (60)로 변경하면 모두 공간으로 용량으로 채워집니다. 따라서 모든 필드는 이제 실제로 60 자입니다.

Varchar (60)로 되돌아가는 것은 도움이되지 않습니다. 필드는 여전히 60 숯이 길다 ....

실제로해야 할 일은 모든 필드에서 트림 기능을 실행하여 트림 길이로 다시 줄인 다음 데이터베이스 축소를 수행하는 것입니다.

그렇게 한 후에는 낭비 된 공간을 되 찾으려면 클러스터 된 인덱스를 재건해야합니다. 클러스터 된 인덱스는 실제로 데이터가있는 곳입니다. 다음과 같이 재건 할 수 있습니다.

ALTER INDEX IndexName ON YourTable REBUILD 

기본적으로 기본 키는 클러스터 된 인덱스입니다 (다른 방법으로 지정하지 않는 한).

마크

다른 팁

"수축 데이터베이스"를 사용해도 데이터를 정리하거나 압축하지 않았습니다.

DBCC 클리닝 가능

테이블 또는 인덱스 뷰에서 삭제 된 가변 길이 열에서 공간을 회수합니다.

그러나 a 간단한 인덱스 재 구축 클러스터 된 인덱스가있는 경우 또한해야합니다

ALTER INDEX ALL ON dbo.Mytable REBUILD

Tony Rogerson의 예제

나는 당신이 묻는대로 당신의 질문에 대답하지 않는다는 것을 알고 있지만, 당신은 데이터의 일부를 기록 테이블에 보관하고 적은 행으로 작업하는 것을 고려 했습니까?

대부분의 시간은 언뜻보기에 모든 데이터가 항상 필요하다고 생각할 수 있지만 실제로 앉아서 검사 할 때 사실이 아닌 경우가 있습니다. 아니면 적어도 나는 전에 그 상황을 경험했습니다.

나는 여기서 비슷한 문제가있었습니다 SQL Server, ntext를 nvarchar (max)로 변환 그것은 ntext를 nvarchar (max)로 변경하는 것과 관련이 있습니다.

나는해야했다 UPDATE MyTable SET MyValue = MyValue 모든 것을 잘 조정하도록하기 위해.

이것은 분명히 많은 레코드에서 꽤 오랜 시간이 걸립니다. 더 나은 방법에 대한 많은 제안이있었습니다. 그들은 열쇠가 끝났는지 여부를 나타내는 임시 깃발이었습니다. 그런 다음 모든 것이 끝날 때까지 루프로 한 번에 몇 천을 업데이트했습니다. 이것은 내가 얼마나 많은 일을하고 있는지에 대한 "일부"통제력을 가지고 있음을 의미했습니다.

또 다른 참고로, 데이터베이스를 가능한 한 많이 축소하려면 복구 모델을 단순하게 아래로 내려 놓고 트랜잭션 로그를 축소하고 페이지의 모든 데이터를 재구성 한 다음 다시 전체로 설정하면 도움이 될 수 있습니다. 복구 모델. 그래도 데이터베이스의 수축은 일반적으로 권장되지 않으며, 라이브 데이터베이스의 복구 모델을 줄이면 무언가 잘못 될 것을 요구하고 있습니다.

또는 어디에서나 추가 데이터가 걸리지 않도록 전체 테이블 재 구축을 수행 할 수 있습니다.

CREATE TABLE tmp_table(<column definitions>);
GO
INSERT INTO tmp_table(<columns>) SELECT <columns> FROM <table>;
GO
DROP TABLE <table>;
GO
EXEC sp_rename N'tmp_table', N'<table>';
GO

물론, 정체성, 색인 등으로 인해 상황이 더욱 복잡해집니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top