次のような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回、夜間に実行するので、たとえ何時間かかっても問題ではありません。データベースを最大限に最適化する必要があるだけです。任意の入力をいただければ幸いです。
ありがとう!
少なくともSQL Serverでは、スクリプトがデータベースの動作について誤解されていると思います。
私は、これまでに得たものは最適とはほど遠く、はるかに効率的で無駄のない方法でデータベースを最適化するのに役立つはるかに優れたソリューションがあることを言わなければなりません。 Ola's solution 、 SQLFool's solution 、および新しい Fragmentation Manager を確認してください。*これらはデータベースを縮小しませんが、インデックスを最適化しますインテリジェントな方法であり、データベースを縮小するべきではありません。
*(免責事項:私はSQL Sentryで働いています。)
here に移動し、スクリプトをダウンロード/インストールします。
これが本番用である場合は、スクリプトを自分で作成しないことを強くお勧めします。ホイールを再発明する代わりに、すでに十分にテストされたスクリプトのセットを使用する方がはるかに優れています(そして簡単です!)。
個人的には、データベースを縮小するつもりはありません。再び成長する必要があるときは、もっと時間がかかります。また、ファイルシステムの断片化を悪化させる可能性もあります。
なぜ実行したいのですかDBCC FREEPROCCACHE;
?
キャッシュされたすべてのexecプランが削除されます。それは実際には悪いことです。キャッシュされたexecプランは、クエリの実行時間を改善します。