Могу воспользоваться советом, чтобы сделать мой запрос умнее - PullRequest
0 голосов
/ 13 марта 2012

Привет, ребята. У меня есть следующий запрос, но профсоюзы делают его довольно тяжелым, так что любой может помочь в исправлении моего запроса.Есть 3 сценария.1. pack_no = упаковка предмета (внутри packitem) 2. item = предмет внутри упаковки (внутри packitem) 3. item = не имеет упаковки (внутри item_master)

SELECT DISTINCT item, loc FROM
(SELECT e.pack_no item, g.store loc
 FROM dc_store_ranging a
 JOIN store g
   ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND
      g.store_close_date >= SYSDATE
 LEFT JOIN dc_pim_export_vert b
        ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V')
 LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac
 JOIN item_master d
   ON (b.item = d.item OR c.item = d.item) AND d.status = 'A'
 LEFT JOIN packitem e
   ON (b.item = e.pack_no or c.item = e.pack_no) AND d.item = e.pack_no
 WHERE d.item NOT IN
      (SELECT f.item
       FROM item_attributes f
       WHERE f.sh_store_order_unit = 'N' AND f.sh_trade_unit = 'Y')
 UNION
 SELECT e.item, g.store loc
 FROM dc_store_ranging a
 JOIN store g
   ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND
      g.store_close_date >= SYSDATE
 LEFT JOIN dc_pim_export_vert b
        ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V')
 LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac
 JOIN item_master d
   ON (b.item = d.item OR c.item = d.item) AND d.status = 'A'
 LEFT JOIN packitem e
        ON (b.item = e.pack_no or c.item = e.pack_no)
 WHERE e.item NOT IN
      (SELECT f.item
       FROM item_attributes f
       WHERE f.sh_store_order_unit = 'N' AND f.sh_trade_unit = 'Y')
 UNION
 SELECT d.item, g.store loc
 FROM dc_store_ranging a
 JOIN store g
   ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND
      g.store_close_date >= SYSDATE
 LEFT JOIN dc_pim_export_vert b
        ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V')
 LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac
 JOIN item_master d
   ON (b.item = d.item OR c.item = d.item) AND d.status = 'A'
WHERE d.item NOT IN
      (SELECT f.item
       FROM item_attributes f
       WHERE f.sh_store_order_unit = 'N' and f.sh_trade_unit = 'Y')
);

1 Ответ

2 голосов
/ 13 марта 2012

Самый простой способ повысить производительность запроса - это изменить UNION s на UNION ALL s - таким образом, запрос должен удалить дубликаты только один раз.

Однако можно упростить этот запрос до:

WITH CTE AS
(SELECT d.item d_item, e.item e_item, e.pack_no e_pack_no, g.store loc
 FROM dc_store_ranging a
 JOIN store g
   ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND
      g.store_close_date >= SYSDATE
 LEFT JOIN dc_pim_export_vert b
        ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V')
 LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac
 JOIN item_master d
   ON (b.item = d.item OR c.item = d.item) AND d.status = 'A'
 LEFT JOIN packitem e
        ON (b.item = e.pack_no or c.item = e.pack_no)
)
SELECT DISTINCT item, loc FROM
(--SELECT e_pack_no item, loc FROM CTE WHERE d_item = e_pack_no UNION ALL -- this select is a subset of the third select
 SELECT e_item item, loc FROM CTE UNION ALL
 SELECT d_item item, loc FROM CTE) uc
WHERE uc.item NOT IN
      (SELECT f.item
       FROM item_attributes f
       WHERE f.sh_store_order_unit = 'N' and f.sh_trade_unit = 'Y')
...