-1

一般的な SQL サーバーがインデックスを格納する方法と、インデックスがレコード (行) を検索する方法について一般的な質問があります。テーブルにインデックスが作成されると、すべてのインデックスがメモリ内に格納されますか? SQL サーバーの起動時に、すべてのインデックスがディスクからメモリに読み込まれますか?

もう 1 つの質問は、インデックスがテーブル内の行をどのように見つけるかということです。インデックスが見つかり、その場所がディスク上のある場所にハッシュされるようなハッシュ関数によるものですか? データはどのようにディスクに保存されますか? 場所によって?Sqlサーバーではデータの取得が高速であるため、ちょっと困惑しています。

4

1 に答える 1

1

クラスタ化されたインデックス構造で説明されています:

SQL Serverでは、インデックスはBツリーとして編成されます。インデックスBツリーの各ページはインデックスノードと呼ばれます。Bツリーの最上位ノードはルートノードと呼ばれます。インデックスの最下位レベルのノードは、リーフノードと呼ばれます。ルートノードとリーフノードの間のインデックスレベルは、まとめて中間レベルと呼ばれます。クラスタ化インデックスでは、リーフノードに基になるテーブルのデータページが含まれます。ルートおよび中間レベルのノードには、インデックス行を保持するインデックスページが含まれています。各インデックス行には、キー値と、Bツリーの中間レベルのページまたはインデックスのリーフレベルのデータ行へのポインタが含まれています。インデックスの各レベルのページは、二重リンクリストでリンクされています。

非クラスター化インデックスは、Bツリーとしても同様に編成されます。

非クラスター化インデックスは、次の重要な違いを除いて、クラスター化インデックスと同じBツリー構造を持っています。

  • 基になるテーブルのデータ行は、クラスター化されていないキーに基づいて並べ替えられたり、保存されたりすることはありません。
  • 非クラスター化インデックスのリーフレイヤーは、データページではなくインデックスページで構成されています。

Bツリーはウィキペディアで説明されています:

コンピュータサイエンスでは、Bツリーは、データの並べ替えを維持し、対数時間での検索、順次アクセス、挿入、および削除を可能にするツリーデータ構造です。Bツリーは、ノードが3つ以上の子を持つことができるという点で二分探索木の一般化です。

検索トピックでは、bツリー検索アルゴリズムについて説明します。

検索は、二分探索木の検索に似ています。ルートから開始して、ツリーは上から下に再帰的にトラバースされます。各レベルで、検索は、分離値が検索値のいずれかの側にある子ポインター(サブツリー)を選択します。バイナリ検索は通常(必ずしもそうとは限りませんが)ノード内で使用され、対象の分離値と子ツリーを検索します。

インメモリとオンディスクについては、バッファ管理についてお読みください。

バッファマネージャは、データベースディスクファイルからバッファキャッシュにデータまたはインデックスページを読み取り、変更されたページをディスクに書き戻すための機能を管理します。バッファマネージャがより多くのデータを読み込むためにバッファ領域を必要とするまで、ページはバッファキャッシュに残ります。データは、変更された場合にのみディスクに書き戻されます。バッファキャッシュ内のデータは、ディスクに書き戻す前に複数回変更できます。詳細については、「ページの読み取り」および「ページの書き込み」を参照してください。

于 2013-03-18T12:09:59.247 に答える