最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

基于HANA的universe最佳实践之JOIN_BY_SQL

[复制链接]
跳转到指定楼层
楼主
发表于 2014-11-10 14:01:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 乔帮主 于 2014-11-10 14:04 编辑

在将HANA作为数据库创建universe建模时,有一条最佳实践,利用JOIN_BY_SQL特性。

这要从头说起,从一个另外相关的设置 - "Multiple SQL statements for each measure"。它的作用如同名字所表示的,对于使用的每一个measure单独生成一条SQL语句。目的是什么的?在基于数据库表设计universe建模的时候,有时候会遇到CHASM。在某些特殊场合下,报表的结果会不准确,比如产生笛卡尔积。解决方案之一便是将分别存在于不同表中的measure单独取出并在WEBI里面进行UNION操作。仅仅勾选这样一个选项,很棒。
我们看下面这样的例子来更好地理解(这里没有CHASM或者FAN,只是为了演示这个参数)
这是一个很简单的data foundation,而measure存在于两张表中


如果在WEBI的query panel里选择了这两个measure,而没有勾选这个选项,那么生成的SQL是什么样的呢?

[SQL] 纯文本查看 复制代码
SELECT  [/size]
  sum(Table__2."Quantity"),  
  sum(Table__1."GrossAmount"),  
  Table__1."OrderId",  
  Table__2."OrderItem"  
FROM  
  "OPENSAP.workshop::header"  Table__1 INNER JOIN "OPENSAP.workshop::item"  Table__2 ON (Table__1."OrderId"=Table__2."OrderId")  
    
GROUP BY  
  Table__1."OrderId",   
  Table__2."OrderItem"  


我们看到是一条SQL语句,利用INNER JOIN来连接的,这就是可能产生CHASM的SQL。
那么我们勾选这个选项,再次运行同样的WEBI,结果如何呢?我们发现WEBI生成了两条SQL,然后用自己的UNION操作将他们组合起来。



但是如果每个查询返回的数据很多会怎样?在WEBI里面做UNION效率一定不高,这时就可能产生性能问题。
这时候我们就可以借助JOIN_BY_SQL,将操作推到数据库层面去做。那么问题是,这与最开始没有勾选‘Multiple SQL statements for each measure“默认产生INNER JOIN语句时的区别在哪呢?我们先去universe里设置一下看看结果再说。


再次运行同样的WEBI报表,获得的SQL语句:
[SQL] 纯文本查看 复制代码
SELECT  
  COALESCE( F__1.Axis__1,F__2.Axis__1  ),  
  COALESCE( F__1.Axis__2,F__2.Axis__2  ),  
  F__1.M__3,  
  F__2.M__3  
FROM  
     (   
     SELECT  
       Table__1."OrderId" AS Axis__1,  
       Table__2."OrderItem" AS Axis__2,  
       sum(Table__1."GrossAmount") AS M__3  
     FROM  
       "OPENSAP.workshop::header"  Table__1 INNER JOIN "OPENSAP.workshop::item"  Table__2 ON (Table__1."OrderId"=Table__2."OrderId")  
         
     GROUP BY  
       Table__1."OrderId",   
       Table__2."OrderItem"  
       )  
      F__1  
      FULL OUTER JOIN   
     (   
     SELECT  
       Table__1."OrderId" AS Axis__1,  
       Table__2."OrderItem" AS Axis__2,  
       sum(Table__2."Quantity") AS M__3  
     FROM  
       "OPENSAP.workshop::header"  Table__1 INNER JOIN "OPENSAP.workshop::item"  Table__2 ON (Table__1."OrderId"=Table__2."OrderId")  
         
     GROUP BY  
       Table__1."OrderId",   
       Table__2."OrderItem"  
       )  
      F__2  
      ON ( F__1.Axis__1=F__2.Axis__1  AND  F__1.Axis__2=F__2.Axis__2  )  




楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-6 01:00

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表