在 SAP 项目里使用CDS Table Function时,有一个性能问题特别容易靠经验判断。
假设底层数据库表有几百万甚至几千万条数据,我们通过CDS Table Function包了一层AMDP SQLScript,业务程序再从这个 Table Function 上查询数据,并加上类似下面这样的过滤条件。
WHEREregion='07'真正影响性能的并不是这一句WHERE有没有写,而是这条过滤条件最终跑到了哪里。
一种情况是,SAP HANA 优化器能够把外层查询与 Table Function 内部逻辑组合起来,让REGION = '07'一直下推到底层TABLE SCAN。数据库真正扫描和处理的数据从源头就已经被限制。
另一种情况完全不同。Table Function 先执行完整逻辑,把整个 Client 的数据生产出来,等函数执行结束以后,外层查询才从函数结果里留下region = '07'的部分。
两种 SQL 从 ABAP 开发者视角看起来差不多,运行成本却可能相差两个数量级。
这也是为什么仅仅看到 CDS 外面存在WHE