프로덕션 데이터베이스에 525GB 크기의 테이블이 있는데 그 중 383GB는 사용되지 않습니다.
이 공간 중 일부를 되찾고 싶지만 프로덕션 DB를 망치기 전에 데이터가 적은 테스트 DB의 동일한 테이블에서 일부 전략을 테스트하고 있습니다. 이 테이블에는 비슷한 문제가 있습니다.
테이블에 대한 일부 정보 :
- 채우기 비율이 0으로 설정되었습니다.
- 약 30 개의 열이 있습니다
- 열 중 하나는 이미지 유형의 LOB이며 크기는 몇 KB에서 수백 MB 사이 인 파일을 저장합니다.
- 테이블에 관련된 가상 인덱스가 없습니다
서버에서 SQL Server 2017 (RTM-GDR) (KB4505224)-14.0.2027.2 (X64)를 실행 중입니다. 데이터베이스가 SIMPLE
복구 모델을 사용 중 입니다.
내가 시도한 것들 :
- 인덱스 재 구축 :
ALTER INDEX ALL ON dbo.MyTable REBUILD
. 이것은 무시할만한 영향을 미쳤다. - 인덱스 재구성 :
ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON)
. 이것은 무시할만한 영향을 미쳤다. LOB 열을 다른 테이블에 복사하고 열을 삭제하고 열을 다시 만든 다음 데이터를 다시 복사했습니다 (이 게시물에 설명 된대로 사용되지 않은 공간 SQL Server 테이블 해제 ). 이것은 사용되지 않은 공간을 줄 였지만 사용 된 공간으로 변환하는 것처럼 보였습니다.
bcp 유틸리티를 사용하여 테이블을 내보내고 자르고 다시로드합니다 (이 글에서 설명 된대로 테이블에 사용되지 않은 공간을 확보하는 방법 ). 이것은 또한 사용되지 않은 공간을 줄이고 위의 이미지와 비슷한 정도로 사용 된 공간을 늘 렸습니다.
- 권장되지는 않지만 DBCC SHRINKFILE 및 DBCC SHRINKDATABASE 명령을 시도했지만 사용되지 않은 공간에는 영향을 미치지 않았습니다.
- 달리기
DBCC CLEANTABLE('myDB', 'dbo.myTable')
는 차이가 없었습니다 - 이미지 및 텍스트 데이터 유형을 유지하면서 데이터 유형을 varbinary (max) 및 varchar (max)로 변경 한 후 위의 모든 것을 시도했습니다.
- 데이터를 새로운 데이터베이스의 새 테이블로 가져 오려고 시도했지만 사용되지 않은 공간 만 사용 된 공간으로 변환했습니다. 나는 이 게시물 에서이 시도의 세부 사항을 설명했다 .
이것이 내가 기대할 수있는 결과라면 프로덕션 DB에서 이러한 시도를하고 싶지 않습니다.
- 이러한 시도 후에 사용되지 않은 공간이 사용 된 공간으로 변환되는 이유는 무엇입니까? 나는 후드에서 무슨 일이 일어나고 있는지 잘 이해하지 못하는 것 같습니다.
- 사용 된 공간을 늘리지 않고 사용되지 않은 공간을 줄이기 위해 다른 방법이 있습니까?
편집 : 다음은 테이블에 대한 디스크 사용량 보고서 및 스크립트입니다.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable](
[Column1] [int] NOT NULL,
[Column2] [int] NOT NULL,
[Column3] [int] NOT NULL,
[Column4] [bit] NOT NULL,
[Column5] [tinyint] NOT NULL,
[Column6] [datetime] NULL,
[Column7] [int] NOT NULL,
[Column8] [varchar](100) NULL,
[Column9] [varchar](256) NULL,
[Column10] [int] NULL,
[Column11] [image] NULL,
[Column12] [text] NULL,
[Column13] [varchar](100) NULL,
[Column14] [varchar](6) NULL,
[Column15] [int] NOT NULL,
[Column16] [bit] NOT NULL,
[Column17] [datetime] NULL,
[Column18] [varchar](50) NULL,
[Column19] [varchar](50) NULL,
[Column20] [varchar](60) NULL,
[Column21] [varchar](20) NULL,
[Column22] [varchar](120) NULL,
[Column23] [varchar](4) NULL,
[Column24] [varchar](75) NULL,
[Column25] [char](1) NULL,
[Column26] [varchar](50) NULL,
[Column27] [varchar](128) NULL,
[Column28] [varchar](50) NULL,
[Column29] [int] NULL,
[Column30] [text] NULL,
CONSTRAINT [PK] PRIMARY KEY CLUSTERED
(
[Column1] ASC,
[Column2] ASC,
[Column3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column4] DEFAULT (0) FOR [Column4]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column5] DEFAULT (0) FOR [Column5]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column15] DEFAULT (0) FOR [Column15]
GO
ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DF_Column16] DEFAULT (0) FOR [Column16]
GO
Max Vernon의 답변에서 명령을 실행 한 결과는 다음과 같습니다.
╔════════════╦═══════════╦════════════╦═════════════════╦══════════════════════╦════════════════════╗
║ TotalBytes ║ FreeBytes ║ TotalPages ║ TotalEmptyPages ║ PageBytesFreePercent ║ UnusedPagesPercent ║
╠════════════╬═══════════╬════════════╬═════════════════╬══════════════════════╬════════════════════╣
║ 9014280192║ 8653594624║ 1100376║ 997178 ║ 95.998700 ║ 90.621500 ║
╚════════════╩═══════════╩════════════╩═════════════════╩══════════════════════╩════════════════════╝
╔═════════════╦═══════════════════╦════════════════════╗
║ ObjectName ║ ReservedPageCount ║ UsedPageCount ║
╠═════════════╬═══════════════════╬════════════════════╣
║ dbo.MyTable ║ 5109090 ║ 2850245 ║
╚═════════════╩═══════════════════╩════════════════════╝
최신 정보:
Max Vernon이 제안한대로 다음을 실행했습니다.
DBCC UPDATEUSAGE (N'<database_name>', N'<table_name>');
그리고 출력은 다음과 같습니다.
DBCC UPDATEUSAGE: Usage counts updated for table 'MyTable' (index 'PK_MyTable', partition 1):
USED pages (LOB Data): changed from (568025) to (1019641) pages.
RSVD pages (LOB Data): changed from (1019761) to (1019763) pages.
테이블의 디스크 사용량이 업데이트되었습니다.
그리고 전체 디스크 사용량 :
따라서 SQL Server에서 추적 한 디스크 사용량이 실제 디스크 사용량과 크게 일치하지 않는 것이 문제인 것 같습니다. 이 문제가 해결 된 것으로 간주하지만, 왜 이런 일이 처음에 발생했는지 알고 싶습니다.
DBCC UPDATEUSAGE
중 사용되지 않은 공간 및 사용되지 않은 페이지 수가 업데이트되었습니다. SQL Server에서보고하는 디스크 사용량과 페이지 정보가 완전히 동기화되지 않은 것 같습니다. 자세한 내용으로 게시물을 업데이트했습니다. 나는 이것이 처음에 어떻게 일어날 지 궁금하지만 적어도 문제가 발견되었습니다. 모든 도움에 감사드립니다. 정말 감사합니다!