web-dev-qa-db-ja.com

4,000,000行のSQL Serverテーブルは40GBです

私は、実稼働データベースが最近非常に大きくなった理由を解明しようとしており、原因が監査テーブルであることがわかりました。問題を修正するためにテーブルをアーカイブしますが、このような大きなSQLサーバーテーブルの場合、テーブルのサイズが正常に見えるかどうかを確認したいと思います。次の構造を持つ4,000,000行があります...

Name                    Type        Nullable
AuditLogId              bigint      no
UserName                nvarchar    no
TimeOfChange            datetime    no
ObjectName              nvarchar    no
ChangeName              nvarchar    no
RecordId                int         yes
OriginalValues          nvarchar    yes
ResultingValues         nvarchar    no

AuditLogIdに主キーがある

ALTER TABLE [dbo].[AuditLog] ADD  CONSTRAINT [PK_AuditLog] PRIMARY KEY CLUSTERED 
(
    [AuditLogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO

RecordIdで更新されたレコードへの外部キーもあります。 nvarcharフィールドは最大で12,0000文字で、平均は約8000文字であるようです。テーブルのサイズは現在40GBですが、それでよろしいですか?上記で投稿した内容でその質問に答えられない場合は、表に詳細情報を記載できます。

ありがとう

4
Hoody

4,000,000行あり、1列の平均文字数は8,000文字(16,000バイトと思います)。

SELECT CONVERT(bigint,4000000) * /* b */ 16000 / /*kb*/ 1024 / /*mb*/ 1024;
------
61,035

統計が正確であれば、このテーブルは61 GBになると思います。 (8,000文字ではなく8,000バイトを意味するのでしょうか。その場合、30 GBを超えると予想されます。)

その他の要因は次のとおりです。

  • 上記の計算で考慮しなかった他の列のデータ
  • 追加のインデックス
  • フィルファクタ> 0および<100
  • 削除された行またはページ分割によって依然として占有されている断片化とスペース
17
Aaron Bertrand

SQL Serverでは、nvarchar列は 1文字あたり2バイト であるため、12k文字の場合、非常に大きなテーブルを簡単に作成できます。列にUnicodeデータが格納されていない場合は、varcharに変換してストレージを解放できます。

0
DatabaseShouter