【问题标题】:Oracle SQL Optimization : hierarchical queryOracle SQL 优化:分层查询
【发布时间】:2011-10-20 14:02:48
【问题描述】:

我有这个查询,它获取记录列表并跟踪每条记录的谱系,但它永远运行。谁能帮我提高性能?

  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';

下面是这个查询的解释计划

【问题讨论】:

  • 抱歉,由于分辨率原因,explain_plan 不可读
  • 但是让我问一下 - 存在哪些索引?
  • 最好将执行计划以纯文本形式复制到pastebin.com
  • 请在新标签页中查看解释计划图片,您可以看到更清晰的副本,希望对您有所帮助。

标签: sql oracle hierarchical


【解决方案1】:

基数从 1100 万突然变为 1 看起来是个问题。从查询中删除表和谓词,直到您准确找出导致该错误估计的原因。

大多数情况下,这些问题是由错误的统计信息引起的,请尝试收集所有相关表的统计信息。 (我能想到几十个其他潜在问题,但在你能把问题缩小一点之前,可能不值得猜测。)

【讨论】:

  • 从查询中删除表和谓词是什么意思?如果可以的话,能否指导一下解释计划,我不太明白,谢谢
  • 将您的查询分成更小的部分,运行它们,并将实际行数与估计的行数(基数)进行比较。随着查询变大,基数估计通常会变得更糟,您想找到它出错的第一个地方。例如,如果您只运行 root_nodes,那么实际和估计的行数是多少?
  • 我尝试运行每个小查询,发现 upstream_genealogy 需要永远运行,但我不知道如何改进它,有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多