如果我不使用完整密钥,单记录缓冲是否有效?

Does Single Record Buffering work if I do not use the full key?

我在 ABAP 中有一个标准的 table,激活缓冲,键入 Single Records。然而,每个 SELECT 都会进入数据库。
table 有字段 [MANDT, A, B],但 SELECT 仅使用 MANDT 和 A。这可能是缓冲区被绕过的原因吗?

正如the documentation for table buffering所说,“单记录”缓冲仅在您提供完整的主键时才有效。

当这是一个受您控制的 table 并且没有其他应用程序可能更喜欢不同的缓冲策略时,您可以将其缓冲类型更改为“Generic Area”并输入您希望成为缓冲键一部分的键字段数(在本例中为 2)。当 table 非常小时,您甚至可以考虑启用“全缓冲”,这将在请求单个行时立即将整个 table 加载到应用程序服务器的内存中。

或者,当您对 table 的所有访问都发生在同一个会话中时,您可以考虑在 ABAP 级别构建自己的内存缓冲。如果您需要自己的跨会话缓冲,您可以使用 shared memory class 构建一个缓冲区。但是,当对 table 的写操作超出您的控制范围或对其他应用程序服务器进行写操作时,这当然会成为问题。

TLDR:

Does Single Record Buffering work if I do not use the full key?

解释如下:

你怎么能“知道”sap 在做什么。好的,假设您检查文档的更正版本,文档通常非常准确。

7.5.4 文档说

When using single record buffering, any ABAP SQL statements must respect the full primary key to prevent them from bypassing table buffering.

换句话说,如果 table “缓冲的全键”,任何没有完整键的读取尝试都会进入数据库。 在旧版本中还有另一个 TRAP,其中投影忽略缓冲区。 运行 表 1 中 Select 字段 A 上的测试跟踪,其中全键。验证是否使用了缓冲区。 (下面解释)

如何测试实际发生的情况。
找一个很少有人使用应用服务器的时间...
使用您的测试代码打开 window。 (使用 Eclipse :))
在另一个 window 中打开 st05。

  1. 重置 table 缓冲区(你是在开发系统中吧!)
    /$TAB 进入命令字段。

  1. IN ST05 开始跟踪 SQL 并缓冲

  2. 运行 你的测试程序。 使用不同的技术访问记录。或者重复访问以测试缓冲。例如

    数据:ls_t001类型 t001。
    select单*从t001变成ls_t001
    其中 bukrs = '0001'.
    select单*从t001变成ls_t001
    其中 bukrs = '0001'.
    select 从 t001 到 ls_t001
    的单个 butxt 其中 bukrs = '0001'.

  3. 停止跟踪并显示/分析跟踪 您可以过滤跟踪输出以仅显示有问题的 table

蓝线是缓冲区访问。 黄线是 SQL 数据库访问。

您可以看到单条记录访问如何导致读取/加载 57 条记录。 IE 完整或通用 table 缓冲。为我的客户加载了所有内容。

小心:不要被诱惑使用 SE16 作为您的测试工具。
它对测试缓冲的人有一个陷阱。
SE16 使用 select BYPASSING BUFFER 语句

要完成本主题,查看 AL12 很有用。 您现在可以“查看”各种缓冲区内容。 不要忘记其他客户....在分析时