4

これによれば:

選択度は 0 から 1 の間の値であり、テーブルにフィルターを適用した後に返される行の割合です。たとえば、テーブルに 10,000 行があり、クエリが 2601 行を返す場合、選択性は 2601/10000 または .26 または 26 パーセントになります。選択性により、ユーザー (またはオプティマイザー) は、実行計画で最適なデータ アクセス方法を決定できます。

いくつか明確にする必要があります。わかりました、そのテーブルには 10000 行があり、クエリによって返されるのは 2601 行だけです。しかし、そのクエリ ブロックに 3 つの結合されたテーブルが含まれている場合、または where 句にサブクエリが含まれている場合はどうなるでしょうか。FROM 句には 3 つのテーブルがあり、4 番目のテーブルは where 句のサブクエリの一部です。この選択性はどのように計算されるのでしょうか?

選択性 = 条件を満たす行の数 (どのテーブルから?) / 行の総数 (4 つのテーブルすべてから?)

カーディナリティについても同じ質問です (カーディナリティ = 選択性 * 行の総数)。

これに関する多くの記事を見つけましたが、それぞれの記事では、単一のテーブルまたは単一の where 句の条件に基づいて、単純な select ステートメントを使用してこれらの概念を例示しています。

もう少し複雑なクエリ (「hr」スキーマ、またはその他のトレーニング目的のスキーマ)、つまり FROM 句のサブクエリ、または WHERE 句などの場合に、これらの測定値がどのように計算されるかの例を教えてください。

ありがとうございました。

EDIT:Estimator(Cost-Based Optimizer)によって計算された選択性の尺度について明確にする必要があります。 http://gerardnico.com/wiki/database/oracle/selectivity たとえば、等値述語 (last_name = 'Smith') の場合、選択度は last_name の個別の値の数 n の逆数に設定されます。 n 個の異なる値のうちの 1 つをすべて含む行。

「異なる値の数 n の逆数」ということを理解する方法がわかりません。

employees テーブルに 107 行があり、クエリコードが [すべて選択] [表示/非表示] であると仮定します。

select * from employees where last_name = 'Smith'

2 行を返します。選択度は 2/107 = 0.01? したがって、述語を満たす行数/行の総数です。したがって、この方程式には「明確な」ものは含まれていません。

ステートメントのこの選択性とは別に、列の選択性もあり、これは NDV (その列の個別の値の数 - dba_tab_col_statistics からクエリ可能) / 行の総数 ( http://www.runningoracle .com/product_info.php?products_id=233 )。したがって、NDV が 103 の場合、last_name 列の選択性は 103/107 = 0.96 です。

これは私が理解したものです..これは正しいですか?私が間違っている場合は、私を修正してください。

ありがとうございました。

4

1 に答える 1

3

選択性は常に、その時点で適用されている基準に基づいています。

これが特定のテーブルに対して正確に何を意味するかは、結合順序によって異なります。

Oracle は常に、特定のテーブルから行を選択することによってクエリの実行を開始します。この場合、あなたが読んだ例のように、選択性は簡単です。この時点で考慮すべき結合条件はありません。

次に、2 番目のテーブルに結合します。Oracle は、最初のテーブルからの結合条件とともに、そのテーブルのみで両方の定数条件を直接満たす行数を推定します。後者は「結合選択性」と呼ばれます。

次に、3 番目のテーブルを結合するときに、最初の 2 つのテーブルへの結合と一定の条件に基づいて推定します。

これが、プランにとって結合順序が非常に重要である理由の 1 つです。

于 2014-03-09T22:00:21.760 に答える