2011-10-19 146 views
1

我有這個查詢獲取記錄列表並跟蹤每條記錄的族譜,但它永遠運行。任何人都可以幫助我改善性能嗎?Oracle SQL優化:分層查詢

WITH root_nodes AS 
    (SELECT distinct dlot.dim_lot_key AS lot_key, facility, lot 
    FROM pedwroot.dim_lot dlot 
    JOIN AT_LOT a 
    ON (a.at_lot = dlot.lot AND a.at_facility = dlot.facility) 
    WHERE (dlot.has_test_lpt = 'Y' 
     or dlot.has_post_test_lpt = 'Y') and a.at_facility = 'MLA'), 

    upstream_genealogy AS 
    (SELECT /*+ INDEX(fact_link_lot IX_R_FLLOT_DLOT_2)*/DISTINCT CONNECT_BY_ROOT   
      fllot.dst_lot_key AS root_lot_key, 
      fllot.src_lot_key 
    FROM pedwroot.fact_link_lot fllot 
    CONNECT BY NOCYCLE PRIOR fllot.src_lot_key = fllot.dst_lot_key 
    START WITH fllot.dst_lot_key IN (SELECT lot_key FROM root_nodes)), 

    at_lst AS 
    (Select * 
     FROM pedwroot.dim_lot dlot_lst 
     JOIN upstream_genealogy upgen 
     ON (upgen.src_lot_key = dlot_lst.dim_lot_key) 
     where dlot_lst.has_assembly_lpt = 'Y') 

     SELECT distinct dlot_root.lot   AS AT_LOT, 
      dlot_root.facility AS AT_FACILITY, 
      dfac_root.common_name AS AT_SITE, 
      dlot_root.LTC   AS AT_LTC, 
      al.lot    AS AT_LST, 
      dlot_src.lot   AS FAB_LOT, 
      dlot_src.facility  AS FAB_FACILITY, 
      dfac_src.common_name AS FAB_SITE 
     FROM upstream_genealogy upgen 
     JOIN at_lst al 
     ON (upgen.root_lot_key = al.root_lot_key) 
     JOIN pedwroot.dim_lot dlot_src 
     ON (upgen.src_lot_key = dlot_src.dim_lot_key) 
     JOIN pedwroot.dim_lot dlot_root 
     ON (upgen.root_lot_key = dlot_root.dim_lot_key) 
     JOIN pedwroot.fact_lot flot 
     ON (dlot_root.dim_lot_key = flot.lot_key) 
     JOIN pedwroot.dim_facility dfac_root 
     ON (flot.facility_key = dfac_root.dim_facility_key) 
     JOIN pedwroot.dim_facility dfac_src 
     ON (flot.fab_facility_key = dfac_src.dim_facility_key) 
     WHERE dlot_src.has_fab_lpt = 'Y'; 

下面是這個查詢 enter image description here

enter image description here

+2

對不起,explain_plan由於分辨率 –

+0

是不可讀的,但讓我問 - 存在哪些索引? –

+0

更好地將執行計劃複製爲純文本格式,如http://pastebin.com/ –

回答

0

11萬至1基數的突然變化看起來像一個問題的解釋計劃。從查詢中刪除表和謂詞,直到找出導致估計不準的原因。

大多數情況下,這些問題都是由不良統計信息引起的,請嘗試收集所有相關表的統計信息。 (我可以想到幾十個其他潛在的問題,但它可能不值得猜測,直到你可以縮小問題一點。)

+0

從查詢中刪除表和謂詞是什麼意思?如果沒問題,你可以引導解釋計劃,我不太明白,謝謝 – Ianthe

+0

將你的查詢分解成更小的部分,運行它們,並將實際的行數與估計的行數(基數)進行比較。基數估計通常會隨着查詢變大而變得更糟,您希望找到第一個出錯的地方。例如,如果只運行root_nodes,那麼實際和估計的行數是多少? –

+0

我試圖運行每個小查詢,並發現upstream_genealogy需要永久運行,但我不知道如何改進它,有什麼建議嗎? – Ianthe