使用 Cognos 10.1,Inner Join 或 "IN" Filter 哪个更好?

Using Cognos 10.1 which is better an Inner Join or an "IN" Filter?

我正在使用 Cognos 10.1,并且我有一个报告使用两个查询,每个查询都具有相同的主键。

查询 1:UniqueIds
查询 2:详细信息

我不确定如何判断使用带有 PrimaryKey in (UniqueIds.PrimaryKey) 过滤器的 DetailedInfo 查询构建报告是否更好,或者我是否应该创建第三个查询将 UniqueIds 连接到 DetailedInfo on主键。

我是 Cognos 的新手,我正在学习以不同的方式思考。使用 MicroSoft SQL 服务器我只使用内部连接。

所以我的问题是,在 Cognos 10.1 中哪种方式更好,如何判断性能差异?

你最好从头开始。 您的查询(我希望查询主题)应该加入 Framework Manager 的模型中。然后,您可以通过将过滤器应用于第一个查询来轻松过滤第二个查询。 在 Report Studio 中加入是最后的解决方案。

报告编写者的终极武器是索引良好的数据仓库,并在其上构建了可靠的框架模型。

您希望所有的过滤和连接都尽可能发生在数据库端。如果没有,那么大型数据集会在 Cognos 加入和过滤之前被带到 Cognos 服务器。

在数据库上进行的工作越多,您的报告就会越快。通过以特定方式构建报告,您可以减轻 Cognos 端处理并促进数据库端处理。

正如 Alexey 指出的那样,第一个也是最好的方法是使用一个好的框架模型。这将使您的报告更简单,并将大部分工作推送到数据库。

然而,一个好的模型仍然向报告作者公开 table 键,以便他们可以灵活地创建独特的数据集。并非每份报告都需要一个新的星型模式,有时您希望加入针对两个不同星型模式源的查询结果。

当使用连接或过滤器时,Cognos 默认会尝试将所有工作推送到数据库。它希望将最终数据集发送给它,而不是其他任何东西。

但是,在创建过滤器时,您有两种定义变量的方法...使用引用建模数据源的明确名称(即 [Presentation View].[Sales].[Sales Detail].[Net Profit] ] ) 或引用当前数据集中的列(例如 [Net Profit] )。使用模型中的显式列将有助于确保在数据库中应用过滤器。

有时这是不可能的,例如计算列。例如,如果您的数据库或模型中没有净利润,您可以使用计算列来建立它。如果您过滤 [Net Profit] > 1000,Cognos 将在应用您的过滤器之前将数据集拉入 Cognos。您的最终结果将是相同的,但根据应用过滤器前后的数据大小,您可能会看到性能下降。

您的报告中可能存在嵌套查询,cognos 将为最高级别的查询生成一个巨大的 SQL 语句,其中包括所有较低级别数据的子查询。您可以生成 SQL/MDX 以查看 Cognos 如何构建查询。

此外,尝试进行试验。用新名称保存您的报告,尝试一种方式并计时。 运行 多试几次,取平均执行速度。用替代方法再次计时并比较。

对于较小的数据集,您不太可能看出任何差异。您的数据集越大,您的方法对报告速度的影响就越大。

使用联接将两个查询合并在一起,以便可以在报表中使用来自两个查询的列。如果您唯一的愿望是在一秒钟内使用相应行的存在来过滤一个查询,请使用 IN() 语法。也就是说,在很多情况下,这两种方法的性能可能相同,具体取决于所涉及的行数、索引等。

顺便说一下,在一个报表中,Cognos 只支持不同查询之间的连接和联合。即使没有建立关系,您也可以直接在过滤器中引用其他查询,但我已经看到了这一点的怪癖,就像它在 运行 交互但未计划或导出时有效。我会避免在报告中这样做。