[英]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
首先,您不需要所有子查詢。 CASE
比DECODE()
更可取,尤其是在這種情況下,它簡化了代碼:
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.