この記事では、SQLデータベースのインデックスの重要性について説明します。また、クラスター化インデックスと非クラスター化インデックスの概要についても説明します。さらに、この記事では、SQL Serverインデックスの破損の理由、破損したインデックスを特定する要因、およびそれを修正する方法について説明しています。
SQL Serverのインデックスは、テーブルまたはビューから行を取得するプロセスを高速化するのに役立ちます。ただし、クエリのパフォーマンスを向上させるには、インデックスを正しく選択することが重要です。 SQL Serverは、クラスター化インデックスと非クラスター化インデックスをサポートしています。これらのインデックスのいずれかが破損すると、行のフェッチが遅れる可能性があります。また、一部の行を取得しているときに、異なる値または削除された値を取得する場合があります。さらに、テーブルのインデックスが破損しているため、最も長く実行されているクエリが失敗する可能性があります。
どのような状況でも、SQL Serverデータベースワークフローが影響を受けないように、インデックスの破損を適時に修復する必要があります。
インデックスの破損をトラブルシューティングする方法について説明する前に、クラスター化インデックスと非クラスター化インデックスの概要を簡単に説明しましょう。
クラスター化インデックスと非クラスター化インデックスの概要
テーブル内の列に主キー制約を適用すると、列にクラスター化インデックスが作成されます。クラスタ化されたインデックスは、データを物理的に並べ替え、定義されたインデックスキーに基づいてデータをテーブルに格納します。データは1つの順序でしか並べ替えることができないため、複数のクラスター化されたインデックスを持つことはできません。
ただし、非クラスター化インデックスは、テーブルの行とは別にデータを並べ替えて格納します。基本的に、これは、関連付けられたテーブルへのリンクを持つテーブルデータの列のコピーです。クラスタ化インデックスとは異なり、1つ以上の非クラスタ化インデックスを持つことができます。
SQL Serverインデックスの破損の原因は何ですか?
インデックスは、時間の経過とともに大幅に断片化される可能性があり(一括挿入、更新、または削除操作のため)、定期的なメンテナンスが必要です。フラグメント化されたインデックスは、クエリパフォーマンスの低下を引き起こし、破損する可能性があります。また、SQL Serverのバージョンのアップグレード、SQLプログラムのバグ、システムの突然のシャットダウンなどの要因により、SQLServerのインデックスが破損する可能性があります。特に、テーブルで「NOLOCKヒントを使用した複雑なUPDATEステートメント」を実行すると、非クラスター化インデックスが破損する可能性があります。
SQL Serverインデックスの破損を修復する方法について説明する前に、破損したインデックスを特定する方法を確認しましょう。
SQLServerのインデックスの破損を特定する方法
次の方法を使用して、インデックスが破損しているかどうかを判断できます。
- 異なる値または削除された値を持つ行をフェッチしてから、「ROWID」コマンドを実行して欠落しているエントリを特定します。 SQLエラーログを確認して、不足しているエントリを追跡することもできます。
- 非クラスター化インデックスが破損している場合、DBCCCHECKDBを実行すると次のエラーメッセージが報告されます。
メッセージ2511、レベル16、状態1、行31
テーブルエラー:オブジェクトID 613577224、インデックスID 2、パーティションID 72057594041401344、
ユニットID72057594047037440を割り当てます(入力行データ)。
ページ(1:264)、スロット2および3のキーの順序が正しくありません。
- クラスター化されたインデックスを使用している場合、エラーを示す次のメッセージが表示される場合があります。
サーバー:メッセージ1902、レベル16、状態3、行1
テーブル「テーブル名」に複数のクラスター化インデックスを作成することはできません。別のクラスター化インデックスを作成する前に、既存のクラスター化インデックス「クラスター化インデックス名」を削除してください。
SQL Serverインデックスの破損を修復する方法は?
SQLServerインデックスの破損を修復するために使用できる次の無料の方法に従ってください。
方法1-バックアップからの復元
クラスター化されたインデックスまたはクラスター化されていないインデックスの破損が疑われる場合でも、破損が発生する前に、バックアップを使用して影響を受けるデータを復元します。
ただし、バックアップに最新の更新がない場合、バックアップからの復元は機能しません。データの損失につながる可能性もあります。その場合は、次の方法を試してください。
方法2–破損したインデックスを削除して再作成する
注: これは、非クラスター化インデックスでのみ機能します。
次の手順に従って、破損を示すすべてまたは特定のインデックスを削除します。
- SQL Server Management Studio(SSMS)のサーバーインスタンスに接続します 。
- 「オブジェクトエクスプローラー」 ウィンドウで、インデックスが破損しているテーブルを含むデータベースを展開します。
- テーブルを右クリックして、「スクリプトテーブル」を選択します オプションで、「DROPAndCREATETo」にカーソルを合わせます 新しいクエリエディタをクリックします
破損したインデックスの再作成に失敗した場合は、インデックスの修復を試すことができます。
方法3–SQLデータベースを修復する
最後の手段として、テーブルのインデックスが破損している(クラスター化または非クラスター化)データベースに対して、「REPAIR_ALLOW_DATA_LOSS」を指定してDBCCCHECKDBコマンドを実行します。ただし、これによりデータが失われる可能性があります。別の解決策として、MSSQLのStellarRepairなどのSQL修復ツールを使用してみてください。このツールは、データベースファイル(.mdfおよび.ndf)を修復し、インデックス、ビュー、ストアドプロシージャ、およびその他すべてのコンポーネントを復元するのに役立ちます。復元されたインデックスやその他のデータベースオブジェクトを、ライブデータベースまたは新しいデータベースに直接インポートできます。
修復されたファイルを保存する前に、SQLデータベース修復ソフトウェアのデモバージョンをダウンロードして、回復可能なインデックスをプレビューします。
結論
インデックスの破損が疑われる場合は、記事で概説されている要因を使用して、インデックスが破損しているかどうかを判断してください。また、SQLServerインデックスの破損の背後にある考えられる理由と破損を修復する方法を確認してください。この方法には、バックアップからのデータベースの復元、インデックスの削除と再作成、データベースの修復とそのすべてのコンポーネントの復元が含まれます。 SQL修復ツールを使用して、破損したクラスター化および非クラスター化SQLインデックスを修正し、アクセスできないデータベースオブジェクトを回復することも検討してください。