0

別の質問がありますが、より具体的にします。

百万行のテーブルを選択すると、1秒未満かかることがわかります。私が理解していないのは、インデックスでこれを行う方法です。シークを実行するには 10 ミリ秒かかるように見えるため、1 秒で成功するには 100 秒未満のシークを実行する必要があります。行ごとにインデックス エントリがある場合、1M 行はインデックスを格納するための少なくとも 1K ブロックになります (実際には、行ごとに 8 バイト (32 ビット インデックス値 + 32 キー オフセット) の場合はより高くなります)。次に、実際に行に移動してデータを収集する必要があります。データベースはどのようにしてシークを低く抑え、そのデータを同じ速度でプルするのでしょうか?

4

1 に答える 1

0

1 つの方法は「クラスター化インデックス」と呼ばれるもので、テーブルの行はクラスター化インデックスの並べ替えに従って物理的に並べ替えられます。次に、インデックス付きフィールドに沿って値の範囲を読み取りたい場合は、最初の値を見つけて、追加の IO なしで一度にすべてを読み取ることができます。

また:

1) インデックスを読み取るとき、インデックスの大きなチャンクが一度に読み込まれます。B ツリーを下っていく (または範囲を見つけたら一番下の子に沿って移動する) と、既にメモリに読み込まれている別のノードに移動する場合は、IO を保存したことになります。

2) SQL サーバーが統計的に取得することを期待するレコード数が非常に多いため、インデックスから基になる行に移動するためのランダム アクセス要件が非常に多くの IO 操作を必要とするため、テーブル スキャンを実行する方が高速である場合、代わりにテーブル スキャンを実行します。これは、たとえば SQL Server または PostgreSQL のクエリ プランナーを使用して確認できます。ただし、範囲が小さい場合は通常、インデックスの方が優れており、クエリ プランにこれが反映されます。

于 2013-01-23T00:29:18.840 に答える