Oracle SQL Optimization: иерархический запрос - PullRequest
1 голос
/ 19 октября 2011

У меня есть этот запрос, который получает список записей и отслеживает генеалогию каждой записи, но он выполняется вечно. Может ли кто-нибудь помочь мне улучшить производительность?

  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

1 Ответ

0 голосов
/ 20 октября 2011

Внезапное изменение количества элементов с 11 миллионов до 1 выглядит проблемой. Удалите таблицы и предикаты из запроса, пока не выясните, что именно является причиной этой плохой оценки.

В большинстве случаев эти проблемы вызваны плохой статистикой, попробуйте собрать статистику для всех связанных таблиц. (Я могу подумать о десятках других потенциальных проблем, но, вероятно, не стоит догадываться, пока вы не сможете немного уменьшить проблему.)

...