SQL Server Management Studio が次のストレージ統計を示すテーブル [ExampleSource] があります。
- インデックス領域: 58 MB
- 行数: 28269319
- データ容量:4,567MB
さまざまなインデックス構成のベンチマークを行う目的で、次のコマンドを使用してテーブルをコピーしました。
SELECT *
INTO [ExampleSource_Test]
FROM [ExampleSource]
クエリが終了するとすぐに、驚くべきことに気付きました。新しいテスト テーブルのデータ サイズは劇的に小さくなりました。
- インデックス領域: 0.016 MB
- 行数: 28269319
- データ容量:2,820MB
新しいテーブルには同じデータがあり、インデックス/主キーはありません。新しい Test テーブルに主キー (元のキーと同じ) を追加すると、次の結果が得られました。
- インデックス スペース: 22.227 MB
- 行数: 28269319
- データ容量:2,820MB
キーを追加してもデータ領域が増加しなかったことは驚くべきことではありません。
それが役立つ場合のテーブル構造は次のとおりです。
CREATE TABLE [dbo].[ExampleSource]
(
[C1] [bigint] NOT NULL,
[C2] [nvarchar](9) NOT NULL,
[C3] [nvarchar](5) NOT NULL,
[C4] [int] NOT NULL,
[C5] [nvarchar](1) NOT NULL,
[C6] [int] NOT NULL,
[C7] [bit] NOT NULL,
[C8] [date] NULL,
[C9] [decimal](29, 9) NULL,
[C10] [nvarchar](max) NULL,
[C11] [nvarchar](1) NULL,
[C12] [decimal](29, 9) NULL,
[C13] [nvarchar](3) NULL,
CONSTRAINT [PK_ExampleSource]
PRIMARY KEY CLUSTERED ([C2] ASC, [C3] ASC, [C4] ASC, [C5] ASC, [C6] ASC, [C1] DESC)
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]
元のテーブルは、時間の経過とともに多くの行が挿入された結果であり、通常は一度に数千回挿入されます。更新も削除もありません。元のテーブルとのこの劇的なスペースの違い (インデックスとデータの両方) の原因は何なのか疑問に思っています。SQL Server は、一度にすべてをコピーするときにデータの最適化/再編成を大量に行っていると推測していますが、元のテーブルに大量の無駄なスペースがあった理由の適切な説明を探しています。この肥大化を防ぐために、テーブルで時折実行できる/すべきメンテナンスはありますか?