前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老话新谈之HANA连接

老话新谈之HANA连接

作者头像
matinal
发布2020-11-27 15:38:13
9420
发布2020-11-27 15:38:13
举报
文章被收录于专栏:SAP TechnicalSAP Technical

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

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

写在前面

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

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

如果你对HANA平台还不了解,请参考我之前的文章,直接点击下面连接进入。

HANA平台的优势Ⅰ

HANA平台的优势Ⅱ

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 实际上这种连接类型是一个内部连接,更多关于TEXT JOIN请参考我之前的文章:多语言的秘密

根据测试结果,TEXT JOIN也不会执行连接裁剪。

选择连接类型要根据需求和实现步骤来确定,最终再选择一个既效率高又满足需求的连接类型。

全文到此结束,感谢阅读。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档