老话新谈之HANA连接

SAPtechnical

聊聊SAP的那些事儿

更多精彩请关注公众号,不要错过精彩内容哦。

如果你觉得文章还不错,请推荐给你的朋友吧。

不得不说,在数据库层面的连接类型话题,已经是一个老生常谈的话题了。(文章中有些错别字,还是感觉重新编辑一下发送比较好)

通过连接运算符可以实现多个表查询,多表连接查询也是使用SQL的基本操作,连接是关系数据库模型的主要特点,也是区别于其他类型数据库管理系统的一个标志,但连接的方式有多种,当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。熟练使用这些连接方式能够简化操作,提高数据库运行效率。

写在前面

网上关于连接类型的文章能翻几十页,每篇都有详细解析,分析的也很好很详细。但HANA作为数据库界的新宠,我们还是有必要把老话题重新谈一次。

SAP HANA是一个开放的系统,对标准的SQL 92和SQL 99的核心特征完全支持,同时基于这些标准SAP HANA进行了多种自己私有的SQL扩展。

HANA平台概览,如下图所示:

当我们在HANA里设计一个模型时,我们都是用底层表或者是创建好的模型来互相建立连接,然后实现业务上的逻辑需求。当然模型可以是建立好的属性视图或者是分析视图,最终可以用到计算视图当中来。

连接的重要性

在某些情况下,如果表中数据量非常大的时候,表之间的连接可能会占用很多资源,比如有一个订单抬头表,数据量高达几千万条,一个订单行项目明细表,数据量高达几亿条,这种情况在模型中建立连接就会出现性能问题,还有当我们试图使用SAP HANA的信息模型来非规范化OLTP数据时,往往会出现过多的连接。

Join pruning(连接裁剪)是SAP HANA根据其信息模型中如何定义连接以及如何从信息模型查询数据的方式,从其执行计划中消除表和连接的过程。

举个栗子,假设我们的分析视图中有一个客户表或属性视图,该客户表或属性视图使用左外部联接配置到销售数据表。如果我们查询信息模型并只选择没有GROUP BY或WHERE子句的SUM(SALES_AMOUNT),那么执行计划可能会跳过客户表和销售数据表之间的连接过程。但是,如果我们执行SELECT CUSTOMER_NAME,SUM(SALES_AMOUNT),那么无论使用什么连接类型,都需要客户表和销售数据表之间的连接。

该过程与我们的信息模型中如何配置连接有关。我们平时建模都是根据客户需求,然后开发人员根据自身经验和需求来创建的,不同的开发人员创建的模型也不同。如果我们执行的每个查询都选择了所有的属性和度量值,那么连接裁剪将永远不会被调用。但在实际的项目中,大多数查询只从信息模型中选择一部分数据。所以,我们应该尝试设计在信息模型中利用连接裁剪来优化效率。

连接类型

那么就来说一下INNER JOIN,REFERENTIAL JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN和TEXT JOIN这几种连接类型。下面就概述一下SAP HANA如何处理每种连接类型。

INNER JOIN

INNER JOIN只有在两个表中找到匹配的值时才会返回记录。无论执行什么查询,INNER JOIN都会始终有SAP HANA引擎加入,不会有连接裁剪,总的来说,这种连接类型是在信息模型中定义的花费代价比较高的连接类型之一。如果底层数据库表中的数据维护的不完整,那么结果中可能会丢失数据。

REFERENTIAL JOIN

REFERENTIAL JOIN和INNER JOIN有些类似。但是,在特定情况下,REFERENTIAL JOIN会在信息模型中执行裁剪。假设在属性视图的基础中没有定义过滤器,那么SAP HANA引擎可能会从分析视图的执行计划中剪除连接。假定在同一个属性视图中没有查询列。但是,如果查询中包含属性视图中的列,则此连接将充当内部连接。

如果在属性视图中定义了过滤器,则即使未选择任何属性视图列,连接也将被包含并强制为内部联接。这意味着只有在属性视图和分析视图基础表中找到匹配项时才会返回记录。这也意味着REFERENTIAL JOIN并不总是从信息模型执行计划中进行裁剪。所以,REFERENTIAL JOIN类型可能会和INNER JOIN类型一样花费很大的代价。

所以当REFERENTIAL JOIN被裁剪时,我们必须确保表之间的参照完整性是正确的。如果不是,那么可能会根据查询中选择的列获得不同的结果。

LEFT OUTER JOIN

根据我测试的几个查询场景,假定从模型中定义的属性视图中未选择任何列,则始终从执行计划裁剪LEFT JOIN。通常在分析视图基础表,在属性视图中没有匹配记录的情况下定义LEFT JOIN。即使缺少主数据或者说数据不完整,也能确保返回所有的数据。总的来说,LEFT JOIN有可能成为我们信息视图定义中最好的连接类型。但必须确保在模型用LEFT JOIN是有意义的。而有时却需要INNER JOIN来帮助排除记录。

RIGHT OUTER JOIN

如果需要返回所有属性视图值的情况下,使用RIGHT JOIN联接。根据测试,在执行模型时总是会执行RIGHT JOIN,而在模型的执行过程中,没有看到有裁剪,所以在信息模型中,使用这种连接类型也是会花费很大的代价。

TEXT JOIN

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G092OI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券