问题描述
Cognos在GBase数据库上开发报表时,发现两表关联生成的SQL是分段的,预期是两表做inner join,关联后生成的数据有 238,124条,对两张表的关联sql直接放在gbase管理器中执行时1~2s即出数据,而cognos报表中需要约125s才能展现结果。生成的本地SQL如下图1所示:
图1
对比oracle生成的正常SQL如下如图2所示:
图2
本文档描述了解决该问题的详细步骤。
软件版本信息
产品名称 | 版本号 |
GBase 8a集群 | 8.6.1.1 build 16.19 |
Cognos | 10.2.1 |
GBase ODBC | GBaseODBC_8.3.81.53_build53.11_W32(需更新补丁,参见其他说明) |
问题原因
Cognos对不同数据源的主题进行查询时,会认为这两个数据源是不同的实例,即使两个数据源是同一个库, Cognos仍然会将它们视为不同的实例。因此cognos在生成SQL时无法将联接推到数据库,也即原生 SQL 是没有连接的,是两个独立选择语句,从数据库检索出结果后,两个独立结果集将在 IBM Cognos BI 服务器上进行本地联接,因此效率上也会表现的与预期有差别。
经过资料分析,配置 Framework Manager可以将处理联接查询推到数据库,提升执行的效率。
解决方法
Cognos Framework Manager创建数据源
Cognos Framework Manager创建项目后,建立两个不同数据源的查询主题,本例中两个数据源分别的gbase_dim、gbase_dws,单击gbase_dim,设置该数据源的属性,查询处理选择“仅限于数据库”,Content Manager数据源属性设置为“gbase_dim”,如下图3所示:
图3
同样,单击gbase_dws,设置该数据源的属性,查询处理选择“仅限于数据库”,Content Manager数据源属性设置为“gbase_dim”(此处设置的数据源要与gbase_dim一致),如下图4所示:
图4
查看每个查询主题的SQL,库名.表名的格式,并单击验证通过,如下图5、图6所示,在测试选项卡中,选择“SQL设置”,此处选择“本地”即可,如图7所示。
图5
图6
图7
在Cognos Framework Manager需要建立两表关联关系,如图8所示:
图8
关联建好后,单击【关系SQL】标签页,单击“测试”按钮,测试能够出来数据即可,如图9所示。
图9
以上设置完成后,发布数据包,在数据包上单击右键,创建数据包,按照引导一步步创建即可,如图10所示。
图10
Cognos Reprot Studio创建报表
登录http://localhost:9300/p2pd/servlet/dispatch,选择“启动-->IBM Cognos Administration”,找到刚才发布的数据包,选择数据包后,打开“启动-->Report Studio”菜单,进行报表制作,选择“新建—>列表”,打开报表设计页面,选择查询主题中要展示的列到报表页面,如图10所示。
图11
完成后,单击菜单栏“工具🡪显示生成的SQL/MDX”,如图11、12所示,查看生成的SQL即是两表关联查询的SQL。
图11
图12
如果想显示展示关联SQL则,设置查询1的属性,SQL联结语法为“显示”,如图13所示,生成的本地SQL如图14所示。
图13
图14
处理显示“仅数据库”选项,设置完成后单击生成报表按钮,即可查看生成的报表,如图15、16所示。
图15
图16
其他说明
因民航现场使用的ODBC软件包非最新版本,需要进行关键文件更新。
解压补丁包中的文件,得到gsodbc8.dll、gsodbc8S.dll两个dll文件,拷贝这两个文件到C:\Windows\SysWOW64 覆盖原来的同名文件即可。




