3

IMO、訂正してください...
クラスター化インデックスのリーフには実際のテーブル行が含まれているため、中間リーフを含む完全なクラスター化インデックスには、完全なテーブルよりもはるかに多くのデータが含まれます(?
)全表スキャンよりも選択されましたか?

SELECTリストまたはWHERE条件[1]のいずれにも含まれていないSELECTクエリでCUSTOMER_ID列のクラスター化インデックスはどのように使用されますか?

更新:
「各データページには次および前のリーフノードページへのポインターが含まれているため、スキャンでインデックス内の上位レベルのページを使用する必要がない」ため、全表スキャンよりも全表スキャンの方が高速であることを理解する必要がありますか?
(クエリに参加しない)クラスター化されたインデックスが並べ替えに使用されるなど、他の理由はありますか?

Update2:
後から考える と、IAMポインターを介したテーブルのロードを並列化できる間、連続アクセスではパフォーマンスを向上させることはできません。
クラスター化されたインデックススキャンは、連続したページ読み取りを意味しますか?
クラスタ化されたテーブルは、IAMポインタがないことを意味しますか(全表スキャンの不可能性)?
クラスタ化されたテーブルを完全なテーブルスキャンできないのはなぜですか?
クラスター化インデックスのフルスキャンがフルテーブルスキャンよりも「優れている」方法/理由をまだ理解していません。
クラスター化されたインデックスがあると、パフォーマンスが低下する可能性があるということですか?

問題は、ヒープ(インデックス付けされていない)テーブルではなく、クラスター化されたテーブルに関するものです。

Update3:
「フルクラスター化インデックススキャン」は本当に「フルテーブルスキャン」と同義ですか?
違いは何ですか?

[1]インデックスカバーによりSQLServerクエリのパフォーマンスが向上
http://www.devx.com/dbzone/Article/29530

4

3 に答える 3

2

クラスター化インデックス(より正確には、そのリーフページテーブルデータ)であるため、クラスター化インデックススキャンは、実際にはテーブルスキャンと同じです(クラスター化インデックスを持つテーブルの場合)。

クラスター化インデックスがない場合、テーブルはヒープになります。明らかに、この場合、すべてのデータを確認する必要がある場合、クラスター化インデックスがないため、クラスター化インデックススキャンを実行できません。最終的には、そのヒープテーブルのすべてのデータページにアクセスするテーブルスキャンが実行されます。

于 2010-10-19T16:25:35.857 に答える
2

クラスタ化されたインデックスのリーフレベルはテーブルです。「テーブルスキャン」とは、クラスター化インデックスのないヒープを指します。

各データページには、次および前のリーフノードページへのポインタが含まれているため、スキャンでインデックス内の上位レベルのページを使用する必要はありません。

于 2010-10-19T16:27:15.127 に答える
0

「クラスター化されたテーブルのデータ行に直接アクセスできない-なぜですか?」という私の答えを読んでください。、 最初。

「クラスター化インデックスのリーフには実際のテーブル行が含まれているため、中間リーフを含む完全なクラスター化インデックスには、完全なテーブル(?)よりもはるかに多くのデータが含まれます。」

「テーブル」とストレージ構造を混同しているのを確認してください。あなたの質問の文脈では、例えば。「テーブル」ではなくCIのサイズについて考える場合は、CIからリーフレベル(データ行)を引いたものについて考える必要があります。CI、インデックス部分のみはごくわずかです。中間レベル(他のBツリーと同様)には、部分的な(完全ではない)キーエントリが含まれています。最下位レベルは除外されます。これは、行自体に存在し、複製されない完全なキーエントリです。

テーブル(完全なCI)は10GBの場合があります。CIは10MBのみです。100GBに行かなくても10MBから決定できるものがたくさんあります。

理解のために:同じテーブル(CI)上の同等のNCIは22MBである可能性があります。CIを削除した場合の同じテーブル上の同等のNCIは21.5MBである可能性があります(CIキーが妥当であり、ファットワイドではないと想定)。

「なぜ/いつ/どのように全表スキャンよりもクラスター化インデックススキャン全体が選択されるのですか?」

かなり頻繁に。繰り返しますが、コンテキストは、CIマイナスリーフレベルについて話しているということです。CIの列のみを使用するクエリの場合、CI(実際には任意のインデックス)にこれらの列が存在することで、クエリを「対象クエリ」にすることができます。つまり、インデックスから完全にサービスを受けることができ、移動する必要はありません。データ行に。部分的なキーの範囲スキャンを考えてください:xとyYの間。x <= y; 等

(オプティマイザーがインデックススキャンを選択する必要があると考えた場合、オプティマイザーがテーブルスキャンを選択する可能性は常にありますが、それは別の話です

「クラスター化インデックスの全表スキャンが全表スキャンよりも「優れている」方法/理由はまだわかりません。」

(MSで使用される用語は、ここでの私の回答よりも正確ではありません。)10MB CIから回答できるクエリの場合、100GBではなくデータキャッシュを介して10MBをチャーンする方がはるかに望ましいです。CIキーの範囲で囲まれた同じクエリの場合、これは10MBの何分の1かです。

「全表スキャン」を必要とするクエリの場合は、そうです。CIのすべてのリーフページ(100GB)を読み取る必要があります。

于 2010-10-29T13:19:08.567 に答える