【问题标题】:Reduce cost of oracle sql query降低oracle sql查询成本
【发布时间】:2016-03-14 12:45:08
【问题描述】:

我使用以下查询来查看我的所有报表和付款的概览,按一年中的星期分组:

WITH FILTERED_BALANCES AS
(
    SELECT FACT_AS_BALANCE.* 
    FROM FACT_AS_BALANCE 
      JOIN DIM_AS_CHARACTERISTICS ON FACT_AS_BALANCE.BALANCE_TYPE_ID = DIM_AS_CHARACTERISTICS.ID 
    WHERE DIM_AS_CHARACTERISTICS.TRANSACTION_INTRADAY_FLAG = 'N'
      AND DIM_AS_CHARACTERISTICS.BALANCE_CLOSING_FLAG = 'Y'
)
SELECT DD.WEEK_OF_YEAR, DD.CAL_YEAR, COALESCE(COUNT(DISTINCT FPP.ID),0) AS PAYMENTS, 
       COALESCE(COUNT(DISTINCT FAB.ACCOUNT_STATEMENT_ID),0) AS STATEMENTS
FROM FACT_PAY_PAYMENT FPP
  FULL OUTER JOIN FILTERED_BALANCES FAB ON FAB.BALANCE_DATE_ID = FPP.REQUESTED_EXECUTION_DATE_ID
  JOIN DIM_DATE DD ON FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID OR FAB.BALANCE_DATE_ID = DD.ID 
GROUP BY DD.CAL_YEAR, DD.WEEK_OF_YEAR;

这给出以下输出:

这可行,但我有严重的性能泄漏,因为我在查询中使用了完整的外部联接。您可以在下面找到 Oracle SQL 开发人员的解释计划:

问题是降低此查询的成本。我试图分开付款和报表,但我有一个逻辑问题。当我在 1 周内有付款但没有报表时,报表结果表没有没有报表的那一周的条目。

如何以更好的性能解决这个问题?

【问题讨论】:

标签: sql oracle


【解决方案1】:

在不了解您的数据库结构和样本数据的情况下很难为您提供帮助。请向我们提供更多信息。

仅使用您需要的列替换 WITH 子句中的全表选择。 索引它们。

WITH FILTERED_BALANCES AS
(
    SELECT FACT_AS_BALANCE.BALANCE_DATE_ID
    FROM FACT_AS_BALANCE 
      JOIN DIM_AS_CHARACTERISTICS ON FACT_AS_BALANCE.BALANCE_TYPE_ID = DIM_AS_CHARACTERISTICS.ID 
    WHERE DIM_AS_CHARACTERISTICS.TRANSACTION_INTRADAY_FLAG = 'N'
      AND DIM_AS_CHARACTERISTICS.BALANCE_CLOSING_FLAG = 'Y'
)
SELECT DD.WEEK_OF_YEAR, DD.CAL_YEAR, COALESCE(COUNT(DISTINCT FPP.ID),0) AS PAYMENTS, 
       COALESCE(COUNT(DISTINCT FAB.ACCOUNT_STATEMENT_ID),0) AS STATEMENTS
FROM FACT_PAY_PAYMENT FPP
  FULL OUTER JOIN FILTERED_BALANCES FAB ON FAB.BALANCE_DATE_ID = FPP.REQUESTED_EXECUTION_DATE_ID
  JOIN DIM_DATE DD ON FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID OR FAB.BALANCE_DATE_ID = DD.ID 
GROUP BY DD.CAL_YEAR, DD.WEEK_OF_YEAR;

看看 Oracles 聚合函数:

https://docs.oracle.com/database/121/SQLRF/functions060.htm#SQLRF00633

也许对你有帮助。

无论如何,您都可以用子选择替换完整的外部联接,但我认为这不会有太大的不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2019-08-15
    • 2022-01-14
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多