0

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 は、一度にすべてをコピーするときにデータの最適化/再編成を大量に行っていると推測していますが、元のテーブルに大量の無駄なスペースがあった理由の適切な説明を探しています。この肥大化を防ぐために、テーブルで時折実行できる/すべきメンテナンスはありますか?

4

1 に答える 1

0

考えられる理由の 1 つは、元のテーブルに削除された 1 つ以上の可変長列があったことです。この場合、DBCC CLEANTABLEを使用してみてください。

考えられる 2 番目の理由は断片化です。クエリで確認してみてください。

select a.index_id, name, avg_fragmentation_in_percent  
    from sys.dm_db_index_physical_stats (DB_ID(N'YourDatabase'), OBJECT_ID(N'ExampleSource'), NULL, NULL, NULL) a
    join sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id

一部のインデックスが断片化されている場合は、それらを再編成します。

ALTER INDEX Index_name on Table_Name REORGANIZE WITH (LOB_COMPACTION=ON)

これがあまり役に立たない場合は、「ALTER INDEX REBUILD」を使用してみてください (最後の選択肢として、インデックスを削除して再作成します)。

于 2016-09-01T20:07:06.620 に答える