在做 SAP ABAP 性能分析时,一个很有意思的场景经常出现在ST05。程序里明明执行了一条SELECT SINGLE,但数据库侧几乎看不到对应的 SQL 请求。继续往下追踪,才会发现数据根本没有再次到 SAP HANA 里读取,而是直接从当前 AS ABAP 实例的共享内存返回了。
这背后就是 ABAP Dictionary 里一个存在了很多年的机制,Table Buffering。
到了 SAP S/4HANA 时代,这个机制有时容易被忽略。一个常见想法是,SAP HANA 已经是内存数据库,既然数据本身就在内存中,再给 DDIC Database Table 做 Table Buffering 好像没有多少意义。
实际上这两个内存完全不是一个层面的东西。
SAP HANA 的内存属于数据库层,而 ABAP Table Buffer 位于 AS ABAP 实例自己的 Shared Memory。一次没有命中 Table Buffer 的读取,即使 SAP HANA 已经把相关列页保存在内存中,ABAP 应用服务器仍然需要通过数据库接口把 SQL 请求送往数据库,再经过数据库解析、执行以及数据库与 Application Server 之间的数据传输。命中 Table Buffer 后,ABAP SQL 可以直接处理当前 Application Server 内存中的数据,数据库服务器甚至不需要参与这次读取。
SAP 当前的 ABAP Keyword Documentation 仍然明确把 Table Buffer 定义为当前 AS 实例 Shared Memory 中的一块区域,而且 Table Buffer 由 Databas