Sql 当查询包含多个where子句和聚合函数时,Oracle查询将保持运行

Sql 当查询包含多个where子句和聚合函数时,Oracle查询将保持运行,sql,database,oracle,Sql,Database,Oracle,我正在oracle中运行此select查询。它一直运行,直到我明确停止它。出现此问题的原因是下图中突出显示了带有聚合函数的最后一个where子句条件 Oracle查询: 你能帮我解释一下为什么会这样吗?这是某种甲骨文的限制吗 谢谢用分析函数替换CUSTOMER表上的3个自联接。分析函数将结果集分解为不同的窗口,并可以从每个窗口中提取最大值。从概念上讲,这种方法比连接和MAX函数更复杂,但它可以通过删除连接来显著提高性能 我不完全理解您的数据模型,但我认为类似的方法可以奏效: SELECT * F

我正在oracle中运行此select查询。它一直运行,直到我明确停止它。出现此问题的原因是下图中突出显示了带有聚合函数的最后一个where子句条件

Oracle查询:

你能帮我解释一下为什么会这样吗?这是某种甲骨文的限制吗


谢谢

用分析函数替换CUSTOMER表上的3个自联接。分析函数将结果集分解为不同的窗口,并可以从每个窗口中提取最大值。从概念上讲,这种方法比连接和MAX函数更复杂,但它可以通过删除连接来显著提高性能

我不完全理解您的数据模型,但我认为类似的方法可以奏效:

SELECT *
FROM
(
    SELECT
        ...
        MAX
        (
            CASE
                WHEN "DIMLOOKUP_CUSTOMER1"."VALID TO" <= "FACTTABLELOAD_STAGING"."INVOICE_DATE_KEY"
                THEN "DIMLOOKUP_CUSTOMER1"."VALID TO"
                ELSE NULL
            END
        )
        OVER (PARTITION BY "DIMLOOKUP_CUSTOMER1"."WWI CUSTOMER ID") MAX_VALID_TO
    FROM ...
    WHERE ...
)
WHERE "DIMLOOKUP_CUSTOMER1"."VALID TO" = MAX_VALID_TO;

但这个答案只是猜测。如果您仍然有问题,我建议您运行查询,通过查询GV$SQL找到SQL\u ID,然后将SQL\u ID插入select dbms\u sqltune.report\u SQL\u monitor'SQL\u ID'from dual;该报告将准确地告诉您查询的哪个操作比较慢,并提供有用的信息来推断选择计划的原因。

您有查询中使用的列的索引吗?
SELECT *
FROM
(
    SELECT
        ...
        MAX
        (
            CASE
                WHEN "DIMLOOKUP_CUSTOMER1"."VALID TO" <= "FACTTABLELOAD_STAGING"."INVOICE_DATE_KEY"
                THEN "DIMLOOKUP_CUSTOMER1"."VALID TO"
                ELSE NULL
            END
        )
        OVER (PARTITION BY "DIMLOOKUP_CUSTOMER1"."WWI CUSTOMER ID") MAX_VALID_TO
    FROM ...
    WHERE ...
)
WHERE "DIMLOOKUP_CUSTOMER1"."VALID TO" = MAX_VALID_TO;