由于复杂的 IS NULL OR 条件,Cognos 多事实拼接查询永远运行
Cognos multi-fact stitch query runs forever due to complex IS NULL OR conditions
我正在尝试解决 Cognos Analytics 11.0.9 针对 Oracle 12c 星型模式的失控查询问题。失控查询来自 Framework Manager 包的仪表板报告,涉及多事实计算。正如预期的那样,Cognos 生成 SQL,它使用常见的 table 表达式来查询单个事实 table,然后使用 "stitch query" 根据共同的一致维度合并这些结果。
特定失控查询有 4 个事实 table 和 3 个公共维度。我们的 Oracle DBA 说 WHERE 子句中的 OR 条件导致 Oracle 在评估常见 table 表达式之前尝试加入事实 tables,这是非常昂贵的。
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
当使用动态查询模式时,Framework Manager 中有一个调控器设置来控制拼接查询连接 SQL。设置为 (DQM) Multi Fact Join Operator
,默认值 Is Not Distinct From
生成 SQL,假定可能存在 NULL。当有两个以上的事实表时,默认会像上面那样生成 SQL。
您可以将调控器更改为 Equal operator
以仅在联接中使用“=”。还有一个 Automatic
设置可以在两种模式之间切换,具体取决于模型是否表示公共维度允许 NULL。
这似乎解决了问题,只要您知道公共维度中没有 NULL 即可。有没有人看到更好的解决这个问题的方法?
我正在尝试解决 Cognos Analytics 11.0.9 针对 Oracle 12c 星型模式的失控查询问题。失控查询来自 Framework Manager 包的仪表板报告,涉及多事实计算。正如预期的那样,Cognos 生成 SQL,它使用常见的 table 表达式来查询单个事实 table,然后使用 "stitch query" 根据共同的一致维度合并这些结果。
特定失控查询有 4 个事实 table 和 3 个公共维度。我们的 Oracle DBA 说 WHERE 子句中的 OR 条件导致 Oracle 在评估常见 table 表达式之前尝试加入事实 tables,这是非常昂贵的。
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
当使用动态查询模式时,Framework Manager 中有一个调控器设置来控制拼接查询连接 SQL。设置为 (DQM) Multi Fact Join Operator
,默认值 Is Not Distinct From
生成 SQL,假定可能存在 NULL。当有两个以上的事实表时,默认会像上面那样生成 SQL。
您可以将调控器更改为 Equal operator
以仅在联接中使用“=”。还有一个 Automatic
设置可以在两种模式之间切换,具体取决于模型是否表示公共维度允许 NULL。
这似乎解决了问题,只要您知道公共维度中没有 NULL 即可。有没有人看到更好的解决这个问题的方法?