web-dev-qa-db-ja.com

非常に断片化されたデータベース/テーブルをどのように保存できますか?

最近、SQLの実行時間が遅いことを説明する可能性のある発見をしました。

SSMSのデフォルトでは、一度に1MBのmdfの増加が許可されることがわかりました。 1つのテーブルだけのサイズが約23 GBの場合、これは驚くほど大きな問題です。その結果、テーブルがひどく断片化されています(そしておそらくデータベース全体がひどく断片化されています)。 SQLは、更新を書き込む前に、まず更新用のスペースを作成する必要があるため、更新が非常に遅くなります。また、更新を実行するには、計算を実行する前に毎回数千の1 MBの情報をつなぎ合わせる必要があります。

だから私の質問:これを解決してデフラグする方法はありますか?私はすでにプロパティ-ファイルに入っており、mdf成長レベルを100MBにリセットしました。dbリカバリーは簡単です。デフラグできますか、それともテーブルに移動してテーブルを再作成する必要がありますか、それともデータベース全体を再作成する必要がありますか?かなりの時間と作業が必要になることは承知していますが、このデータベースの主な目標は時間効率です。それは可能な限り速くする必要があり、それが最初からやり直すことを意味するのであれば、それもそうです。

さらに、非常に大きなmdfを1つ持つのではなく、「ファイルグループ」を作成できることが私の注意を引きました。これは複数のmdfを保存するようなものだと理解しています。各テーブル、またはインデックスごとに1つ。これらのファイルグループを安全に作成するにはどうすればよいですか。また、クエリの時間と効率の最適化にも役立ちますか?

6
SQLUser8

テーブルにクラスター化インデックスがある場合、テーブルをデフラグする最も速い方法は、クラスター化インデックスを削除して再作成することです。 SQL Server 2005より前のバージョンでは、DBCC INDEXDEFRAGコマンドを使用して標準インデックスをデフラグできます。

http://msdn.Microsoft.com/en-us/library/ms177571.aspx

または、SQL Server 2005以降で推奨される方法は、ALTER INDEXステートメントを使用することです。

http://technet.Microsoft.com/en-us/library/ms188388.aspx

テーブルにインデックスがまったくない場合は、Windowsを使用してファイルを最適化する必要があります(ただし、ファイル内のデータは移動されません。ファイルのフラグメントが互いに近づくだけです)。

ファイルグループの質問については;複数のファイルがあると、ファイルが別々のディスクにある場合のパフォーマンスが向上します。これは、同時読み取り/書き込みを利用できるためです。大きなインデックスを、それらが属するテーブルの別のドライブにある別のファイルに配置することは、一般に良い習慣として受け入れられています。

これがお役に立てば幸いです。

4
Mr.Brownstone

ブラウンストーン氏が指摘したように、ここには少なくとも2つの問題があります。最初の問題は、ディスク上のファイルの物理的なレイアウトです。疑問を投げかけるのは、データベースを単一の物理ディスク、RAIDアレイ、またはおそらくSANに格納していますか。 SANを使用している場合は、ファイルの物理プロパティについて心配する必要はほとんどありません。クラスタ化インデックスを再編成するだけで非常に役立ちます。ただし、データベースが単一のドライブまたはローカルRAIDアレイでも、Windowsファイルデフラグユーティリティを使用すると大きなメリットが得られる場合があります。SQLServerでの使用が認定されているため、PerfectDiskを使用してドライブをデフラグすることをお勧めします。

1
Max Vernon