web-dev-qa-db-ja.com

SQL Server-データベースファイルを拡大するためのベストプラクティス

私は2週間、SQL Server 2008 R2のデータコレクターを介してファイルの増加を監視しています。データベースは常に約35(MB)/日で成長しています。 DBはまだ初期サイズの2 GBに達していません。

DBファイルの自動拡張は5MBに設定されており、別の方法を試してみたいので、提案やコメントを探しています。

毎週日曜日の夜の午前1時30分に実行される調整タスクがあります。タスクは:

  • データベースの整合性を確認する
  • ログファイルの圧縮–(ログモードがシンプルであるため、問題ありません)
  • データベースの縮小
  • インデックスを再編成
  • インデックスを再構築
  • 統計の更新
  • 履歴をクリーンアップ

毎週のチューニング計画にさらに2つのステップを追加したいと思います。

  1. 使用領域が特定のしきい値または合計サイズに達した場合は、データベースファイルを500 MB増やします。
  2. 使用済みスペースが合計サイズの特定のしきい値に達した場合は、ログファイルを250 MB(圧縮後)増やします。

オフラインの時間に成長の負担をかけることで、高負荷時の自動成長イベントの数を減らしてパフォーマンスを向上させたいと考えています。

自動拡張ファイルに関して2つの質問があります。

  • ファイル拡張ステップを配置するのに最適な場所は、現在のステップの前か後ですか?
  • _ALTER DATABASE|MODIFY FILE_を使用してファイルを拡張する場合、SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)かどうかをどのように判断できますか?
16
Ross Bush

自動成長をできるだけ少なくする必要があります。ファイルを瞬時に初期化しても、1日に7回は耐え難いものです。

データベースの縮小は行わないでください。ずっと。 Shrinkfile、たぶん、しかし、異常なイベントの後でのみ。再び成長するためだけに縮小することは無益なことであり、実際には自動フラグメントと呼ばれるべきです。

復旧モデルが単純な場合、ログファイルを250 GB増やす必要があるはずです。 1か月前にトランザクションを開始し、それをコミットしたりロールバックしたりする意図がない場合を除き、ファイルの使用済みスペースは時間の経過とともに自動的に消去されます。

だから私のアドバイスは:

静かな期間にデータファイルを手動で自動拡張して、数か月の拡張に対応できるサイズにします。それまでの間、何を保存しますか?

データファイルの自動拡張の増分を比較的小さい値に設定し(発生時にユーザーの邪魔にならないようにする)、このイベントでアラートを生成します(たとえば、デフォルトのトレースで、または拡張によってそれをキャッチできます)。イベント)。これは、あなたが見積もった高いポイントに達していることを示している可能性があり、手動で再び成長する時が来ました。この時点で、スペースを収容するために別のドライブに新しいファイル/ファイルグループを追加する場合に備えて、このマニュアルを残しておきます。最終的には現在のドライブがいっぱいになるためです。

たとえば、ログファイルを自動拡張して、これまでで最大の2倍にします。何らかの異常なトランザクションが物事を支えているのでない限り、それはそれ以上自動成長しないはずです。このイベントについても監視して、それらについて知る必要があります。

24
Aaron Bertrand

自動成長は、可能であれば避けるべきものです。問題は、成長がいつ発生するかを制御できず、その間にシステムが深刻な打撃を受ける可能性があることです。

ファイルサイズを1か月程度の適切なサイズに設定し、そこからの成長率を監視して、Xの時間に対してどのくらいのスペースを見積もるかを調べ、サイズ+エラーのマージンにサイズを設定します。

自動拡張の前にファイルサイズが事前定義された最大値に達したときに警告を表示する簡単な監視ジョブを設定しました。次のようなものを使用できます:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

もちろん、これはジョブとしてスケジュールできます。

10
Nick Winstanley