代码之家  ›  专栏  ›  技术社区  ›  Jeff Wright

由于complex is null或条件,cognos multi-fact stitch查询将永远运行

  •  0
  • Jeff Wright  · 技术社区  · 8 年前

    我正试图用CognosAnalytics11.0.9解决一个失控的查询问题,这个问题是针对Oracle12C星型模式的。失控查询来自一个报告framework manager包的仪表板,涉及多事实计算。正如预期的那样,cognos生成使用公共表表达式查询虚拟事实表的sql,然后使用“stitch查询”基于公共一致维度合并这些结果。

    特定的失控查询有4个事实表和3个公共维度。我们的oracle dba说where子句中的or条件导致oracle在计算公共表表达式之前尝试联接事实表,这非常昂贵。

    or条件似乎被设计为处理公共维度中的空值。在我的数据模型中,不存在空值。 有没有办法让cognos生成假定不存在空值的多事实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 回复  |  直到 8 年前
        1
  •  0
  •   Jeff Wright    8 年前

    在使用动态查询模式时,framework manager中有一个调控器设置来控制stitch query join sql。设置为 (DQM) Multi Fact Join Operator ,默认值为 Is Not Distinct From 生成假定可能存在空值的SQL。当有两个以上的事实数据表时,默认值会生成如上所示的sql。

    你可以把州长换成 Equal operator 只在联接中使用“=”。还有一个 Automatic 将在两种模式之间切换的设置,取决于模型是否表示公共维度允许空值。

    这似乎解决了问题,只要您知道公共维度中没有空值。有人看到解决这个问题的更好办法吗?

    推荐文章