2014-08-28 65 views
0

我正在Cognos 10.1.1中工作截止到Cognos的日期逻辑

我有62个列表报表的不同要求,这些报表按列不同。

如果我们根据类别对它们进行分组,31个报告显示BOD和31个显示EOD数据。

EOD(T-2数据)和BOD(T-1数据)。

这是要求。为了减少报告的数量,我们计划将这两个日期逻辑混合在一个报告中。

Case 
    when [Time Selection] = 'EOD' then 
     [As of date] = _add_days(current_date,-2) 
    else 
     [As of date] = _add_days(current_date,-1) 
end 

这工作正常但报表性能有所下降。它的运行时间比单独的报告长。

我试过使用宏,但生成sql时上述情况condtion和宏之间没有区别。

请给我一个解决方案来提高报表性能。

我们正在使用db2。

在此先感谢。

+0

那么,在单独的查询中运行它们并将结果联合在一起呢? – Andrew 2014-08-28 19:22:58

+0

我们需要更多信息,比如查询的其余部分,以及Cognos生成的内容。我有一种感觉,'CASE'_may_可以为每一行运行,这不会有任何帮助。一个天真的优化可能会以'OR'条件结束,这些优化器对任何一个都不太满意(但可能仍然有帮助)... – 2014-08-30 01:25:48

+0

通常,您基于日期查询,但是EOD/BOD改变,你首先根据你的EOD标志查询。你应该检查你的表索引。你可能有一个日期,但没有一个在你的EOD标志上。 – Damienknight 2014-09-02 13:31:43

回答

-1

看着你的代码而不知道你的问题,我不会怀疑你的代码会产生性能问题。这就是说我在使用日期时避免使用=,<>等。相反,我使用内置的日期数学函数。

尝试以下操作:

CASE 
    WHEN [Time Selection] = 'EOD' THEN 
     _days_between([As of date],current_date) = -1 
    ELSE 
     _days_between([As of date],current_date) = -2 
END 

也有另一种语法,也可以执行比现有的代码更好。我们可以消除CASE语句,并在过滤器中使用简单的布尔逻辑:

([Time Selection] = 'EOD' AND _days_between([As of date],current_date) = -1) 
OR 
([Time Selection] <> 'EOD' AND _days_between([As of date],current_date) = -2) 

这句法发生在大多数语言,包括SQL,如果一个企业的第一项和返回,其中假行被跳过优化的优势没有评估第二个任期,因为AND的结果永远不会是真的。

+0

你为什么要避免范围操作符?首先,在列上使用函数是停止使用索引的最快方法 - 优化器无法在索引上寻找,它必须首先运行** all **条目。而如果您使用范围查询(并将日期数学计算为常量,例如'CURRENT_ DATE'),则它可以对查找/扫描进行索引,可能会大大加快查询速度。 [使用日期类型避免的唯一范围运算符是<='](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have -in-common.aspx),像所有积极的非整数类型一样。 – 2014-08-29 07:56:40

+0

我没有对范围运算符进行任何说明,加或减。我给了他两个替代语法,可能会或可能不会减轻他的性能问题。如果你认为你有更好的解决方案,那么你应该发布一个答案。 – Johnsonium 2014-08-29 15:48:20

+1

案例陈述不是任何性能问题的原因。它比任何不必要的I/O执行速度快1k倍。因此,如果一个查询的运行速度比两个查询的速度慢,那么问题不在case语句中。查看执行计划并找出最耗时的地方。 提供个人查询,整个替换查询以及涉及的表格布局,我敢打赌,这只是一个简单的索引,它会使它工作起来。 – TommCatt 2014-08-30 20:44:16