web-dev-qa-db-ja.com

「究極のデータベースメンテナンススクリプト」の作成

次のようなT-SQLスクリプトを作成しようとしています。

A)データベースのサイズを可能な最小サイズに縮小します。 B)整合性チェックを行い、データベースを完全に「再編成」して最適化し、データベースを「新しい」状態にします。

これが私が現在持っているものです:

-- Check database integrity:

DBCC CHECKDB WITH NO_INFOMSGS;
GO

-- Get space usage information:

EXEC sp_spaceused @updateusage = N'TRUE';
GO

-- Shrink database:

DBCC SHRINKDATABASE (0, 0);
GO

-- Reindex all tables:

EXEC sp_msforeachtable N'PRINT ''Indexing table: ?''; DBCC DBREINDEX (''?'');'
GO

-- Update statistics for all tables:

EXEC sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'
GO

-- Clear procedure cache:

DBCC FREEPROCCACHE;
GO

-- Update all usage info in the database:

DBCC UPDATEUSAGE (0);
GO

これらすべてが正しいかどうかを検証していただけますか?コマンドの優先順位(たとえば、インデックスの再構築後の統計の更新、またはその逆)、構文、引数などはすべて最適ですか?他のコマンドを提案できますか?パフォーマンスは問題ではありません。私はおそらくこのスクリプトを月に1回、夜間に実行するので、たとえ何時間かかっても問題ではありません。データベースを最大限に最適化する必要があるだけです。任意の入力をいただければ幸いです。

ありがとう!

5
TX_

少なくともSQL Serverでは、スクリプトがデータベースの動作について誤解されていると思います。

  • まず、汎用のDBCC SHRINKDATABASEコマンドを使用して、データベースをできるだけ縮小します。どうして?データベースが再び大きくなる場合、ファイルを圧縮することで何が得られますか?データベースが再び必要になるまで、一時的にそのスペースを一時的にリースしますか?これはwillにより断片化を引き起こし、インデックスの再作成を困難にします。その詳細については後ほど説明します。
  • 次に、必要があるかどうかに関係なく、すべてのテーブルのインデックスを完全に再作成します。通常、最初にテーブルを分析し、必要に応じて特定のインデックスに対して条件付きアクション(再編成や再構築など)を実行する方がはるかに優れています。
  • すべてのインデックスを再構築していて、インデックスの再構築には、平均でインデックスが占めるスペースの1.5倍が必要です。そのスペースをどこで取得すると思いますか?データベースを縮小しただけなので、空き領域はありません。インデックスの再構築に対応するためのスペースを提供するために、データベースを拡張する必要があるため、データベースを無料で縮小しました。
  • 次に、統計をフルスキャンで更新します。すべてのインデックスを再構築しただけです。この時点で、統計の更新が必要または役立ちますか?インデックスを再構築すると自動的に統計が更新されるので、私はしません。したがって、この余分なステップは無駄です。
  • 最後に、procキャッシュ全体をクリアしても、全体的なパフォーマンスが向上することはまずありません。いくつかのクエリで改善が見られる場合もありますが、それらを調べて個別にクリアする方がはるかに効果的です。風呂水)。

私は、これまでに得たものは最適とはほど遠く、はるかに効率的で無駄のない方法でデータベースを最適化するのに役立つはるかに優れたソリューションがあることを言わなければなりません。 Ola's solutionSQLFool's solution 、および新しい Fragmentation Manager を確認してください。*これらはデータベースを縮小しませんが、インデックスを最適化しますインテリジェントな方法であり、データベースを縮小するべきではありません。

*(免責事項:私はSQL Sentryで働いています。)

22
Aaron Bertrand

here に移動し、スクリプトをダウンロード/インストールします。

これが本番用である場合は、スクリプトを自分で作成しないことを強くお勧めします。ホイールを再発明する代わりに、すでに十分にテストされたスクリプトのセットを使用する方がはるかに優れています(そして簡単です!)。

9
Jon Seigel

個人的には、データベースを縮小するつもりはありません。再び成長する必要があるときは、もっと時間がかかります。また、ファイルシステムの断片化を悪化させる可能性もあります。

7

なぜ実行したいのですかDBCC FREEPROCCACHE;

キャッシュされたすべてのexecプランが削除されます。それは実際には悪いことです。キャッシュされたexecプランは、クエリの実行時間を改善します。

5
Diego