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