在组合的虚拟和非虚拟环境中使用表变量

2020-09-19 09:12发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)根据HANA SQL脚本中有关表...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


根据HANA SQL脚本中有关表变量的较早文章之一,表变量在创建时并未实现,但在查询中使用时却被"内联"。 请参阅Lars Breddemann在以下主题中的回答: https://archive.sap.com/discussions/thread/3633470 。 根据Lars的说法,这比简单地实现有更多的优化,这是有意义的。 但是,对于您的环境具有HANA中的数据和虚拟表(SDA)中的数据的情况,这是有害的行为(至少在我的用例中如此)。 我尝试创建仅查询虚拟表中的数据的表变量和仅查询HANA内存中的表中的数据的表变量,然后假设HANA将实现这两​​个数据集,然后将这两个数据集合并。 但是正如Lars所确认的那样,HANA并未实现表变量,这最终导致将包含虚拟表和非虚拟表的整体查询推送到虚拟数据库。 出于性能原因,这不是我想要的。 有没有一种方法可以迫使HANA在将其从虚拟表中提取到的数据加入生活在HANA上的数据之前,将其具体化? 如果我不能强迫HANA实例化表变量,是否可以使用数组来"实例化"虚拟数据?

2条回答
路亽曱_Ryan
2020-09-19 09:34

您在这里混合使用不同的概念/技术。

使用虚拟表进行查询处理允许将连接表"下推"到远程站点。 这完全独立于SQLScript处理表变量的方式。

对于SDA,确定是否应将联接或子选择推送到远程站点或者将所有必要的数据都放入本地实例并继续在该实例中继续处理是否更好,可能会非常复杂。

据我所知,HANA 1基本上致力于优化以降低总数据传输成本,因为这是长时间运行的主要驱动力之一。 因此,HANA 1尝试估计需要多少数据才能传输到远程站点,然后再传输回本地实例以处理查询。 在许多情况下,尤其是那些结果集相对较大的情况,我都研究过,这种方法会导致决定不将数据下推到远程站点。

请注意,此数据传输成本估算未考虑两个系统之间的数据传输实际需要多长时间。 据我所知,HANA 1中没有可配置的传输成本系数

在我看来,HANA 2在这种情况下更为复杂,并且可以制定出更好的执行计划。 但是,我对此的实施细节了解不足。

使用此查询块下推的一个相当重要的因素是表/视图元数据(主键/唯一约束,NOT NULL约束和数据统计信息)是正确,最新且尽可能具体的 。 没有指定例如 表上的主键可能会导致完全不同的优化结果。

回到您的问题:到目前为止,对于我来说,使用临时表而不是表变量是很不错的,这样可以避免下推到远程站点,这正是您要描述的。

一周热门 更多>