2009-06-05 5 views
3

SQL Server 2005에서 sp_spaceused에 따라 약 3.5GB의 공간을 차지하는 큰 테이블이 있습니다. 그것에는 1,000 만 개의 레코드와 몇 개의 인덱스가 있습니다.SQL Server 2005 : 삭제 된 열로 인한 디스크 공간

필자는 레코드 길이가 절반으로 줄어 들었고, 놀랍게도 그렇게하는 데는 시간이 걸렸습니다. 분명히 sp_spaceused는 여전히 동일한 공간을보고했지만 SQL 서버는 열을 삭제할 때 실제로 "삭제됨"으로 표시하지 않았습니다.

그래서이 테이블의 모든 데이터를 다른 테이블로 이동하고 잘라내어 모든 데이터를 다시 이동하여 모든 데이터를 재구성했습니다.

이제 데이터가 2.8GB로 이전보다 작아졌지만 더 큰 하락이 예상됩니다.

이 테이블이 원래이 열을 가졌다는 사실이 아직 거기에 남아있을 가능성이 있습니까?

잘 자르지 않았습니까? 내가 그것을 놓고 작은 컬럼 세트로 다시 만들어야합니까?

데이터가 실제로 2.8GB를 차지합니까?

감사합니다.

답변

2

"예상보다 큰 하락"을 어떻게 계산 했습니까? 데이터가 8K 페이지로 제공된다는 점에 유의하십시오. 즉, 개별 행이 더 작더라도 항상 저장할 페이지가 적지는 않습니다. 예를 들어 (극단적 인 예) 행이 7.5K 인 경우 페이지 당 한 행만 적합합니다. 일부 열을 삭제하면 행은 5K이지만 여전히 페이지 당 하나의 행입니다.

4

클러스터 된 인덱스를 다시 작성해야합니다 (기본으로 기본 키가 클러스터 된 키라고 가정).

ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD 

데이터는 정말 클러스터형 인덱스의 리프 수준입니다 - 당신이 그것을 다시 한 번, 그것은 "압축"가 될 것이며, 행이 너무, 데이터베이스 크기를 줄이는 훨씬 적은 데이터 페이지에 저장해야합니다.

전혀 도움이되지 않으면 실제로 공간을 확보하기 위해 데이터베이스에서 DBCC SHRINKDATABASE를 실행해야 할 수도 있습니다. 이 두 단계가 함께하면 더 작은 데이터베이스 파일을 얻을 수 있습니다!

마크

+0

그리고 단지 그 작업은 시스템을 실행에 잘 될 것이다, 그것은 3.5GB 테이블입니다 가정? – marquito

+1

@marquito : 물론이 작업을 완료하려면 가동 중지 시간이 필요합니다. –

+0

감사합니다. @ marc_s. 동일한 상황에 직면하고 있으므로 절차를 실행하거나 그 결과에 직면 할 때까지 기다려야 할 것입니다. :) – marquito