使用SQL子查询选择SUM太慢

时间:2016-08-10 11:45:10

标签: sql oracle sum subquery

我有一个“交易”表。

交易可以有多个“TransactionProduct”。

交易产品可以有多个“PriceModifiers”。

我有一个查询,它返回每个交易产品的总价格修饰符(减少金额)。

查询:

SELECT
  TRANSACTION.DESCRIPTION,
  TRANSACTIONPRODUCT.PRODUCTNAME,
  TRANSACTIONPRODUCT.EFFECTIVEPRICE,
    (
        SELECT SUM(AMOUNT)
        FROM PRICEMODIFIER 
        WHERE TRANSACTIONPRODUCTID = TRANSACTIONPRODUCT.TRANSACTIONPRODUCTID
    )
    AS REDUCTIONAMOUNT
FROM 
    TRANSACTION,
    TRANSACTIONPRODUCT
WHERE 
   TRANSACTION.TRANSACTIONID = TRANSACTIONPRODUCT.TRANSACTIONID

如果我使用Sum删除子查询,则查询执行速度非常快。

使用子查询,需要几秒钟......

知道如何改进查询吗?

2 个答案:

答案 0 :(得分:3)

您应该学会使用正确的显式JOIN语法。简单规则:从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

但这与您的性能问题无关。为此,您需要PRICEMODIER(TRANSACTIONPRODUCTID, AMOUNT)上的索引。

答案 1 :(得分:1)

试试这个:

SELECT
  T.DESCRIPTION,
  TP.PRODUCTNAME,
  TP.EFFECTIVEPRICE,
  SUM(PM.AMOUNT)
FROM 
    TRANSACTION T
JOIN TRANSACTIONPRODUCT TP 
    ON T.TRANSACTIONID = TP.TRANSACTIONID
JOIN PRICEMODIFIER PM
    ON PM.TRANSACTIONPRODUCTID = TP.TRANSACTIONPRODUCTID
GROUP BY T.DESCRIPTION, TP.PRODUCTNAME, TP.EFFECTIVEPRICE