saiku查询出错如何debug(saiku查询过程的本质),以及相关workbench的schema设置

saiku连接infiniDB数据库

1,日期维度无结果。

原因:(数据库表内容出错)

          表最后一列(日期字段)匹配出错,用“like %日期%”可以。说明入库时写入多余的空白符,因为直接看不出。windows表数据,放到linux下,后面也是\a\0,要用dos2unix命令转换。

 

 

2,workbench :

(1)维度dimension设置:

      事实表外键和维度表主键关联:从不同维度查询,实际就是两个表联合查询,本质是两个表做自然连接,因此事实表主键和维度表外键要一致,一一对应。如果类型不一致,报错:

SQLException: IDB-1002: 'factdownloadsnew' and 'dimstore' have incompatible column type specified for join condition.

错误设置为事实表外键用datevalue,维度表主键设为id。

 

(2)column设置:这是选择要查看什么内容(本质是 group by column的设定)看哪一列,比如月份,选month,则在主外键自然连接后,按month做group by,进行统计。

        但saiku会自动加上该列的上一级列,进行操作,如month会自动加上year:

saiku自动生成的sql语句为:

SELECT
 `dimDate`.`year` AS `c0`,
 `dimDate`.`month` AS `c1`,
 sum(
  `factDownloadsNew`.`downloads`
 )AS `m0`
FROM
 `dimDate` AS `dimDate`,
 `factDownloadsNew` AS `factDownloadsNew`
WHERE
 `factDownloadsNew`.`date_time` = `dimDate`.`datevalue` // 自然连接要对应
GROUP BY
 `dimDate`.`year`,
 `dimDate`.`month`

group by也自动变成两列。

结果:

对比,将column设置为datevalue(原来是month):

SELECT
 `dimDate`.`year` AS `c0`,
 `dimDate`.`datevalue` AS `c1`,
 sum(
  `factDownloadsNew`.`downloads`
 )AS `m0`
FROM
 `dimDate` AS `dimDate`,
 `factDownloadsNew` AS `factDownloadsNew`
WHERE
 `factDownloadsNew`.`date_time` = `dimDate`.`datevalue`
GROUP BY
 `dimDate`.`year`,
 `dimDate`.`datevalue`

 

 

(3)namecolumn不设定,默认为用column。要显示的内容。

 

总结:

 维度度主外键关联,实现自然连接;

 column为查看内容,实现group by。自动加上一级。

 

 

  

用saiku查错:(saiku查询过程的本质)

 mondrian_sql.log日志信息(tomcat/logs下)中,会给出组装的sql查询语句。sql里直接执行该sql查询语句,看结果,和执行过程。

从执行记录看,一个查询分4步,如

Monthdownloads,组成sql

1       select `dimDate`.`year` as `c0`, `dimDate`.`yearname` as `c1`, `dimDate`.`month` as `c2`, `dimDate`.`monthname` as `c3` from `dimDate` as `dimDate` group by `dimDate`.`year`, `dimDate`.`yearname`, `dimDate`.`month`, `dimDate`.`monthname` order by ISNULL(`dimDate`.`year`) ASC, `dimDate`.`year` ASC, ISNULL(`dimDate`.`month`) ASC, `dimDate`.`month` ASC

统计年和月从dimdate,并分组。

 

2       select count(distinct `year`) from `dimDate`

3       select count(distinct `month`) from `dimDate`

年月个数

4       SELECT

         `dimDate`.`year` AS `c0`,

         `dimDate`.`month` AS `c1`,

         sum(

                   `factDownloadsNew`.`downloads`

         )AS `m0`

FROM

         `dimDate` AS `dimDate`,

         `factDownloadsNew` AS `factDownloadsNew`

WHERE

         `factDownloadsNew`.`date_time` = `dimDate`.`datevalue`

GROUP BY

         `dimDate`.`year`,

         `dimDate`.`month`

核心,表连接查看。

 

 

 

 

负数问题:当反复几次计算后,会出现负数。如计算每天的下载量后,在看每年和每月的会出现负数现象。

.xml的schema文件设置中,cube属性中的cache被勾选(默认)。不勾选,无缓存,不出现负数。

cache是cube的事实表是否用modrian存储。用的话,会有逻辑上问题。。(后期详细排查)

 

 

 

posted on 2014-01-07 18:53  代码王子  阅读(196)  评论(0编辑  收藏  举报

导航