2016-08-15 9 views
1

説明プランのA列の列(ヒント/ * + GATHER_PLAN_STATISTICS * /)で実行されるクエリの行数がなぜ であるのか理解しようとしています。本当ではない。説明プランのA行

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation          | Name      | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Writes | OMem | 1Mem | Used-Mem | 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| 163 |     TABLE ACCESS FULL   | LU_MY_TABLE     | 29568 | 1017 |  31M|00:00:03.51 | 1094K|  0 |  0 |  |  |   | 

LU_MY_TABLE上の完全なテーブルへのアクセスがあるようですが、私は をすれば結果は10169あるLU_MY_TABLEからシンプルselect count(*) ...

は、いくつかのいずれかは、行を理解する上で私を助けてもらえ?

ありがとうございます。 Marco

+0

A-実際、E-推定、単にあなたのテーブルの上に(リフレッシュ)統計情報を収集し、あなたが表示されます。また、エグゼクティブプラン全体を投稿してください。これらの行(A&E)は、表内の行の合計数を表すのではなく、フィルタリングされている行のみを表します。おそらく、テーブルの列に相関値があります。その全体のクエリと計画を見ることなく、言うことは難しい。 – ibre5041

答えて

0

A-Rowsは、その操作のすべての開始で生成された行の合計数です。しかし、E-Rowsは、1回の操作の開始によって生成される行数の見積もりです。あなたの前のコメントは正しいです - おそらく、カーディナリティの見積もりが良いかどうかを判断するためにA-RowsをStartで分割したいと思うでしょう。

例では、1回の操作で1017行が見積もられます。しかし、1回の操作当たりの実際の行は、31M(A行)/ 29568(開始)= 1048(開始あたりの実際の行)でした。それらの数字は非常に近いです。

(実際のテーブルの行の実際の数と異なる理由は分かりませんが、実行プランにIdの次に*はありません。そのため、そのテーブルに明白なフィルタリングはありません。しかし、おそらく他のいくつかの操作は結果を制限している。いずれかの方法、これには問題が別のステップであるかもしれないので、Oracleが良く、この操作を推定していることを暗示するのに十分な情報である。)

テストスキーマ

テーブルを作成します。 10行で実行した後、テーブルのカウントを10回実行するクエリを実行します。

drop table test1 purge; 
create table test1(a number); 
insert into test1 select level from dual connect by level <= 10; 
begin 
    dbms_stats.gather_table_stats(user, 'TEST1'); 
end; 
/

select /*+ gather_plan_statistics */ (select count(*) from test1 where a > b) 
from (select - level b from dual connect by level <= 10); 

select * from table(dbms_xplan.display_cursor(format => 'allstats last')); 

結果:

A-行Idを2でこれが10回を乗じた全表スキャンあたり10行で100です。

(以下計画は少し画面に合わせて変更されました。)

Plan hash value: 2073232735 

--------------------------------------------------------------------------------------- 
| Id | Operation      | Name | Starts | E-Rows | A-Rows | A-Time | 
--------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |  |  1 |  |  10 |00:00:00.01 | 
| 1 | SORT AGGREGATE    |  |  10 |  1 |  10 |00:00:00.01 | 
|* 2 | TABLE ACCESS FULL   | TEST1 |  10 |  1 | 100 |00:00:00.01 | 
| 3 | VIEW       |  |  1 |  1 |  10 |00:00:00.01 | 
| 4 | CONNECT BY WITHOUT FILTERING|  |  1 |  |  10 |00:00:00.01 | 
| 5 | FAST DUAL     |  |  1 |  1 |  1 |00:00:00.01 | 
--------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - filter("A">:B1)