4

すべての例外(メッセージ、stackTraceなど)を格納するテーブルがありますが、テーブルは大きくなっているので、減らしたいと思います。

StackTracesやMessagesなどが繰り返されることはたくさんありますが、圧縮を有効にするとサイズが適度に小さくなり(10%)、SQLServerが列ごとのハッシュテーブルに文字列をインターンするとさらに大きなメリットが得られると思います。

テーブルを正規化してStackTracesを別のテーブルに抽出すると、いくつかの利点を得ることができますが、例外メッセージ、例外タイプなども繰り返されます。

SQL Serverの一部の列で文字列インターンを有効にする方法はありますか?

4

2 に答える 2

4

これを行う組み込みの方法はありません。次のようなことが簡単にできます。

SELECT MessageID = IDENTITY(INT, 1, 1), Message 
  INTO dbo.Messages 
  FROM dbo.HugeTable GROUP BY Message;

ALTER TABLE dbo.HugeTable ADD MessageID INT;

UPDATE h
   SET h.MessageID = m.MessageID
   FROM dbo.HugeTable AS h
   INNER JOIN dbo.Messages AS m
   ON h.Message = m.Message;

ALTER TABLE dbo.HugeTable DROP COLUMN Message;

ここで、いくつかのことを行う必要があります。

  • ロギング手順を変更して、Messages テーブルへの upsert を実行します
  • メッセージ テーブルに適切なインデックスを追加し (メッセージ データ型が不明)、PK を追加します。
  • FK を MessageID 列に追加
  • スペースを再利用するために、HugeTable のインデックスを再構築します。
  • 最初にテスト環境でこれを行います。
于 2012-05-04T16:15:51.740 に答える