【问题标题】:Select SUM using SQL subquery is too slow使用 SQL 子查询选择 SUM 太慢
【发布时间】:2016-08-10 11:45:10
【问题描述】:

我有一个“交易”表。

一个事务可以有多个“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 的子查询,查询的执行速度非常快。

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

知道如何改进查询吗?

【问题讨论】:

  • 您可以添加索引。有索引吗?
  • 对八十年代恐怖查询的报复? 1) JOIN 语法 2) 表别名 3) FULLCAPS 4) 标量子查询 5) “事务”是保留字/关键字;尽量避免作为表/列名
  • 将 sum 子选择包含在 with 子句中,同时包含 id 并按 id 连接,而不是为每一行创建子查询。
  • 几秒现在太慢了?
  • 不,我没有索引。我应该把它们放在什么上面?感谢您对查询的建议...我通常不编写 SQL 查询。 (我使用 ORM)

标签: sql oracle sum subquery


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2022-01-27
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多