【发布时间】: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 周内有付款但没有报表时,报表结果表没有没有报表的那一周的条目。
如何以更好的性能解决这个问题?
【问题讨论】:
-
提供样本数据和期望的结果。可能有更好的方式来表达你的逻辑。
-
这可能有助于解决空旷的几周:stackoverflow.com/questions/4805560/…