2011-10-19 60 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