Cognos 多事实拼接查询由于复杂的 IS NULL OR 条件而永远运行



我正在尝试针对Oracle 12c星型模式解决Cognos Analytics 11.0.9的失控查询问题。失控查询来自框架管理器包上的仪表板报告,涉及多事实计算。正如预期的那样,Cognos 生成 SQL,该 SQL 使用公用表表达式来查询不可访问的事实数据表,然后使用"拼接查询"根据共同的符合维度合并这些结果。

特定的失控查询有 4 个事实数据表和 3 个常见维度。我们的 Oracle DBA 说,WHERE 子句中的 OR 条件导致 Oracle 在计算公用表表达式之前尝试连接事实数据表,这非常昂贵。

OR 条件似乎设计为处理公共维度中的 NULL 值。在我的数据模型中,不存在 NULL 值。有没有办法让 Cognos 生成假设不存在 NULL 的多事实 SQL?

更多详情...为了可读性,我对此进行了一些编辑,但这些查询如下所示:

WITH "FS1" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact1.cost) as cost
FROM fact1
INNER JOIN dim on fact1.dim_key = dim.dim_key
GROUP BY fiscal_year
)
WITH "FS2" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact2.cost) as cost
FROM fact2
INNER JOIN dim on fact2.dim_key = dim.dim_key
GROUP BY fiscal_year
)
WITH "FS3" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact3.cost) as cost
FROM fact3
INNER JOIN dim on fact3.dim_key = dim.dim_key
GROUP BY fiscal_year
)
SELECT COALESCE("FS1".fiscal_year, "FS2".fiscal_year, "FS3".fiscal_year) AS fiscal_year,
("FS1".cost + "FS2".cost) +"FS3".cost AS cost
FROM "FS1" FULL OUTER JOIN "FS2" ON
("FS1".fiscal_year = "FS2".fiscal_year OR ("FS1".cost IS NULL AND"FS2".cost IS NULL)) 
FULL OUTER JOIN "FS3" ON
COALESCE( "FS2".cost, "FS1".cost) = "FS3".cost OR (COALESCE("FS2".cost, "FS1".cost) IS NULL AND "FS3".cost IS NULL)
FETCH FIRST 3001 ROWS ONLY

使用动态查询模式时,框架管理器中有一个调控器设置来控制拼接查询联接 SQL。设置为(DQM) Multi Fact Join Operator,默认值Is Not Distinct From将生成假定可能存在 NULL 的 SQL。当有两个以上的事实数据表时,默认值会生成类似于上述的 SQL。

您可以将调速器更改为Equal operator,以便在连接中仅使用"="。还有一个Automatic设置,它将根据模型是否表示公共维度允许 NULL 在两种模式之间切换。

这似乎可以解决问题,只要您知道公共维度中没有 NULL。有没有人看到这个问题的更好解决方案?

相关内容

最新更新