none
SQL Server 2008 データベースの断片化解消 RRS feed

  • 質問

  • お世話になります。

     

    SQL Server にて、データの追加・更新・削除を繰り返すとデータベースの断片化が発生すると思いますが、

    これを解消し、データベースの使用可能な空き領域を増やす事を考えていますが、どうすればいいのでしょうか?

     

    以前、SQL Server 2000を使用していた時は、一旦別のデータベースにデータベースオブジェクトのコピーをして、

    それをオリジナルに戻すというような事をしていました。

    ところが、SQL Server 2008 にバージョンアップし同様の操作をするとコピーの途中で互換性の問題でエラーとなってしまいました。

    (2000 で作成したデータベースのバックアップを2008にて復元しました。互換性レベルはSQL Server 2000)

    どうもVIEWの作成時にエラーとなっているみたいなのです。

     

    そこで、

    1、別の方法でデータベースの断片化を解消する方法

    2、上記エラーを解消する方法

    どちらかご存知でしたらご教示ください。

     

    SQL Server 2008のエディションはStandardです。

     

    宜しくお願い致します。

     

     

     

    • 移動 山本春海 2011年8月12日 1:20 適切なカテゴリに移動しました。 (移動元:MSDN / TechNet フォーラムへのご意見ご要望)
    2011年8月11日 7:24

回答

  • エラーの詳細がわからないので、1について、です。
    インデックスの断片化であれば再構築や再編成にて解消可能です。
    alter indexコマンド実行やSSMSからの操作を行います。
    http://msdn.microsoft.com/ja-jp/library/ms189858(v=SQL.100).aspx
    ヒープ表をきれいに整理したいのであればデータを再ロードするしかないのではないかと思います。

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月13日 2:20
    モデレータ
  • 断片化したと思われているテーブルにクラスタ化インデックスが存在しない場合、クラスタ化インデックスを作成後、インデックスの再構築を実施することで、断片化は解消されると思います。

    Oracle では、エクスポート/インポートが必要ですが、SQL Server ではインデックスの再構築だけで、同様の結果を得られるはずです。

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月16日 9:26
  • heap table が大量にあって、可変長データを頻繁に update してしまったことでデータページに隙間が大量にあるような状況ということでしょうか。

    すでに書かれているように、クラスタ化インデックスを付与して削除するのが最も手軽だと思いますが、なにがどう現実的ではないのでしょうか? (使用するクラスタ化インデックスは何でもよいですが、指定した順で当初は並べられます) 他の方法として、、

    • 対象となるテーブルをリネームする Table1 → tmp_Table
    • 対象となるテーブルを再作成する CREATE TABLE Table1
    • データを移す INSERT NITO Table1 SELECT * FROM tmp_Table
    • 不要となった旧テーブルを破棄する DROP TABLE Table1

    という操作を繰り返すことでも、データ ページの空きを詰めることができます。この方法だと最大サイズテーブル分のデータ領域が必要になりますがインデックスの対象列を1テーブルづつ考えなくてもよいので sys.tables でも使って一括処理できると思います。

    根本的な問題は、既に書かれていますが、どんなエラーが出ているのか、はっきりさせたほうがいいのでは?

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月23日 0:07

すべての返信

  • エラーの詳細がわからないので、1について、です。
    インデックスの断片化であれば再構築や再編成にて解消可能です。
    alter indexコマンド実行やSSMSからの操作を行います。
    http://msdn.microsoft.com/ja-jp/library/ms189858(v=SQL.100).aspx
    ヒープ表をきれいに整理したいのであればデータを再ロードするしかないのではないかと思います。

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月13日 2:20
    モデレータ
  • 断片化と判断した根拠はなんでしょうか?

    単にトランザクションログが膨れ上がってるだけじゃないのかなぁ…。

    2011年8月14日 2:08
  • 断片化したと思われているテーブルにクラスタ化インデックスが存在しない場合、クラスタ化インデックスを作成後、インデックスの再構築を実施することで、断片化は解消されると思います。

    Oracle では、エクスポート/インポートが必要ですが、SQL Server ではインデックスの再構築だけで、同様の結果を得られるはずです。

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月16日 9:26
  • クラスタ化インデックスが存在しないテーブルに対しては、各テーブルについて、データのエクスポート/インポートを実施しなければいけないのでしょうか?

     

    非クラスタインデックスしか存在しないテーブルが多数存在するので...

    2011年8月22日 7:46
  • 非クラスタインデックスのみのテーブルが多数存在する為、全てにクラスタ化インデックスを作成するのは少し無謀のようです...

     

    ちなみに非クラスタ化インデックスをクラスタ化インデックスにするには、インデックスを削除後、再度クラスタ化インデックスとして作成しなおさないといけないのでしょうか?

     

    2011年8月22日 7:52
  • ログの空き領域は、ログのバックアップにて確保されると思いますが、

    それだけでは、データの空き領域がさほど変わらなかったためそう判断しました。

     

    システム的にもデータの追加・更新・削除を頻繁に行っていますし...

    2011年8月22日 7:55
  • 結局何をしたいのでしょうか。

    断片化を解消したいというのは、断片化率を見ての判断ですか?
    空き領域を増やしたいのですか? データベースファイルが自動拡張されるように設定されていれば、空き領域というのはディスクの空き領域と同等ということになりますが。

    やりたいことを定量的に示してください。

    # 非クラスタ化インデックスの場合、行を並べる基準がないので、空き領域に順次詰めていって断片化が発生しないとかそういうことはないのかなぁ?

    2011年8月22日 21:20
  • heap table が大量にあって、可変長データを頻繁に update してしまったことでデータページに隙間が大量にあるような状況ということでしょうか。

    すでに書かれているように、クラスタ化インデックスを付与して削除するのが最も手軽だと思いますが、なにがどう現実的ではないのでしょうか? (使用するクラスタ化インデックスは何でもよいですが、指定した順で当初は並べられます) 他の方法として、、

    • 対象となるテーブルをリネームする Table1 → tmp_Table
    • 対象となるテーブルを再作成する CREATE TABLE Table1
    • データを移す INSERT NITO Table1 SELECT * FROM tmp_Table
    • 不要となった旧テーブルを破棄する DROP TABLE Table1

    という操作を繰り返すことでも、データ ページの空きを詰めることができます。この方法だと最大サイズテーブル分のデータ領域が必要になりますがインデックスの対象列を1テーブルづつ考えなくてもよいので sys.tables でも使って一括処理できると思います。

    根本的な問題は、既に書かれていますが、どんなエラーが出ているのか、はっきりさせたほうがいいのでは?

    • 回答の候補に設定 山本春海 2011年8月29日 8:48
    • 回答としてマーク 山本春海 2011年9月2日 4:37
    2011年8月23日 0:07
  • こんにちは、swnoyk さん。

     

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

     

    皆さんから参考になるアドバイスをいただいているようでしたので、他の方にもこの情報を有効活用していただくよう勝手ながら私のほうで一旦回答としてマークさせていただきました。

    アドバイスくださった皆さん、ありがとうございます。

     

    いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。

    今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますのでご協力よろしくお願いいたしますね。

     

    他の方からもアドバイスがあったかと思いますが、エラーの詳細および swnoyk さんが対処としては現実的ではないとされていることを具体的な説明などとともに投稿されると、他にも有効な情報が得られるかもしれません。

     

    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。

                                                                                             

    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年9月2日 4:37