2017-03-27 61 views
1

我有這個子查詢爲更大查詢的一部分:甲骨文直方圖返回錯誤的基數

SELECT * 
from totals a 
where A.COMPANY  ='TTT' 
AND A.LOGISTIC_COMP = '111'. 

此表有〜32M行,並在此查詢的行數,這些參數返回〜9M行。

我看到,與不同的參數(公司,logistic_company)我得到不同的表現。

我檢查了一下,發現在這個列上有很大的分佈, 它導致優化器估計基數錯誤。

,所以我用這個語句上創建列的直方圖:

EXEC DBMS_STATS.GATHER_TABLE_STATS ('MY_SCHEMA', 'TOTALS',METHOD_OPT => 'FOR ALL COLUMNS SIZE 1 FOR COLUMNS company size 254, logistic_comp size 254'); 

但即使之後 - 基數留錯了!

優化器認爲有〜250萬行而不是〜9M。

,該計劃使用(這個基數)是最新的指標..

是有意義嗎?

回答

4

很可能你的列是相關的。 Oracle無法計算兩列的統計數據。您可以創建一對列的統計信息。它被稱爲擴展統計

正如link.中所述。在後臺,Oracle將創建無形的虛擬列,表示COMPANY和LOGISTIC_COMP的級聯。

你也應該通過使用提示檢查估計基數與以假亂真GATHER_PLAN_STATISTICS.

  • 創建擴展統計

    SELECT DBMS_STATS.CREATE_EXTENDED_STATS(null, 'TOTALS', '(COMPANY,LOGISTIC_COMP)') 
    FROM DUAL; 
    
  • 使用GATHER_PLAN_STATISTICS暗示

    SELECT /*+ gather_plan_statistics */ * 
    from totals a 
    where A.COMPANY  = 'TTT' 
    AND A.LOGISTIC_COMP = '111'; 
    
  • 執行查詢檢查A-實例與E-stimated基數

    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST')); 
    

PS:由於版本12C甲骨文通過其自身產生對列集這些擴展的統計數據。