2

タイプ CHAR(15) の列 A、B、および C と固有索引を持つ表があるとします。

A と C を指定する WHERE 句を含むクエリがある場合、オラクルのオプティマイザはインデックス レンジ スキャンを選択します。しかし、B のカーディナリティが低いことがわかっている場合、オラクルにインデックス スキップ スキャンを使用するように指示する必要がありますか? スキップ スキャンは、先頭以外の列 (この場合は B) をスキップする方が、範囲スキャンよりもパフォーマンスが高くなりますか? スキップ スキャンは、インデックス内の A と B の両方をスキップしますか? それとも B だけをスキップしますか?

4

1 に答える 1

2

一般に、オプティマイザは、範囲スキャンがスキップ スキャンよりも効率的かどうか (またはその逆) を判断するのに優れています。オプティマイザーが間違った選択をしている場合、問題はほとんどの場合、テーブルとインデックスの正確な統計 (歪んだデータを含む列のヒストグラムなどを含む) の形で適切な情報をオプティマイザーに提供しない人間に帰着します。 )。

任意のクエリについて、2 つのプランのどちらがより効率的かを確実に知る唯一の方法は、クエリを使用してハードウェア上のデータで試してみることです。計画を強制的に変更するためのヒントを追加してみると、どのアプローチが実際により効率的であるかを測定できます。オプティマイザが選択している計画が最も効率的でない場合、根本的な原因は統計の一部が正しくないことにあると考える傾向がありますが、それを取得するには 10053 トレースを調べる必要があります。ほとんどの場合、一番下まで。まれに、オプティマイザーがデータの一部の側面を考慮できないために、オプティマイザーが正しくない場合があります (たとえば、最近まで、carmakemodel、およびyear1 つの値を知っていると、他の列の有効な値のセットが制限される列)。

于 2013-11-19T23:07:09.280 に答える