実稼働データベースに525 GBのサイズのテーブルがあり、そのうち383 GBは未使用です。
このスペースの一部を回収したいのですが、実稼働DBをいじる前に、より少ないデータでテストDBの同一のテーブルでいくつかの戦略をテストしています。この表には同様の問題があります。
テーブルに関するいくつかの情報:
- フィルファクターは0に設定されます
- 約30列あります
- 列の1つはイメージタイプの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 CHECKDB
ますか?あなたから離れて移動すると考えられてい推奨されないデータ型、text
およびimage
?彼らは不適切な統計に貢献している可能性があります。