由于复杂的IS NULL OR条件,Cognos多事实针迹查询将永远运行

时间:2018-06-29 13:10:58

标签: cognos cognos-bi

我正在尝试针对Oracle 12c星型架构使用Cognos Analytics 11.0.9解决一个失控的查询问题。失控查询来自Framework Manager程序包上的仪表板报告,涉及多个事实计算。如预期的那样,Cognos生成了使用通用表表达式来查询单个事实表的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

1 个答案:

答案 0 :(得分:0)

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

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

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