2016-08-15 62 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,但如果我不 簡單select count(*)從LU_MY_TABLE結果是10169 ...

能有人幫我理解A-行?

感謝和問候。 Marco

+0

A-實際,E-估計,只需收集(刷新)在你的表的統計,你會看到。也張貼整個執行計劃。那些行(A和E)不代表表中的總行數,而僅代表被過濾的那些行 - 即那些匹配標準。也許你在表格的列中有一些相關的值。很難說,沒有看到整個查詢和計劃。 – ibre5041

回答

0

A行是該操作的所有開始產生的行的總數。但是E行是一次操作開始時產生的行數的估計值。您之前的評論是正確的 - 您可能想要按開始劃分A行以確定基數估計是否合適。

在您的示例中,Oracle估計每次操作運行1017行。但每次操作的實際行數爲31M(A-Rows)/ 29568(Starts)= 1048(每次啓動的實際行數)。這些數字非常接近。

(雖然我不明白爲什麼他們比排在表中的實際數量等不同,10169.沒有在執行計劃旁編號*所以在該表上沒有明顯的過濾。但也許一些其他的操作限制的結果。無論哪種方式,這是足夠的信息暗示,甲骨文估計這種操作舒服,所以也許問題是另一個步驟。)

測試模式

創建一個表包含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-行中標識2是100。這是每全表10行掃描通過10次相乘。

(下面的計劃稍加修改,以適應屏幕。)

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)