簡體   English   中英

Oracle SQL“復雜”分組查詢優化

[英]Oracle SQL “complex” group by query optimization

我有一個Oracle報告(10g),在其中創建了一些圖形。

現在,在此報告中,我使用兩個如下語句。 我覺得我必須使用兩個子選擇才能以我想要的方式獲取所有信息。 但是該報告現在使用7分鍾來生成,我想知道是否有優化該查詢的方法

SELECT quantity ,
  commodity ,
  TO_CHAR(quantity,'9999999990.000') string_quantity
FROM
  (SELECT SUM(quantity) quantity ,
    commodity
  FROM
    (SELECT vtr.quant_p quantity,
      DECODE(vtr.commo_num,'CU','CU,MS,PB','MS','CU,MS,PB','PB','CU,MS,PB',vtr.commo_num) commodity
    FROM v_transactions_postp vtr
    WHERE vtr.compa_num = :P_COMPA_NUM
    AND vtr.customer    = :P_CUSTOMER
    AND vtr.POSTPERIOD BETWEEN :P_PP_START AND :P_PP_END
    )
  GROUP BY commodity
  )
ORDER BY quantity DESC

首先,您不需要所有子查詢。 CASEDECODE()更可取,尤其是在這種情況下,它簡化了代碼:

SELECT SUM(vtr.quant_p) as quantity,  
       (CASE WHEN vtr.commo_num IN ('CU', 'MS', 'PB') THEN 'CU,MS,PB'
             ELSE vtr.commo_num
        END) as commodity
       TO_CHAR(SUM(vtr.quant_p),'9999999990.000') as string_quantity
FROM v_transactions_postp vtr
WHERE vtr.compa_num = :P_COMPA_NUM AND
      vtr.customer    = :P_CUSTOMER AND
      vtr.POSTPERIOD BETWEEN :P_PP_START AND :P_PP_END
GROUP BY (CASE WHEN vtr.commo_num IN ('CU', 'MS', 'PB') THEN 'CU,MS,PB'
               ELSE vtr.commo_num
          END)
ORDER BY SUM(vtr.quant_p) DESC

然后,為了提高性能,您需要在v_transactions_postp(compa_num, customer, postperiod)v_transactions_postp(compa_num, customer, postperiod)索引。 但是,我懷疑“ v_”表示“視圖”。 這會使查詢更難優化。 您將需要在基礎表上使用適當的索引-或在查詢中擴展視圖。

請嘗試以下查詢:

SELECT sum(vtr.quant_p) quantity,
 (CASE WHEN vtr.commo_num IN ('CU','MS','PB') THEN 'CU,MS,PB' ELSE vtr.commo_num) commodity,
 TO_CHAR(sum(vtr.quant_p), '9999999990.000') string_quantity
 FROM v_transactions_postp vtr
   WHERE vtr.compa_num = :P_COMPA_NUM
     AND vtr.customer = :P_CUSTOMER
     AND vtr.POSTPERIOD BETWEEN :P_PP_START AND :P_PP_END
     GROUP BY commodity
     ORDER BY quantity DESC;

我建議您避免在查詢中使用TO_CHAR只是將其設置為十進制格式。 您可以獲取數量,然后在代碼中添加構造邏輯,例如使用JAVA或PHP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM