db2 - 为什么 `FOR ALL ENTRIES` 会降低 DB6 上 CDS View 的性能?

标签 db2 abap cds

我正在 SAP 核心数据服务(CDS View 、SAP R/3、ABAP 7.50)中使用其主(也是唯一)键列上的 WHERE 子句读取数据。使用 FOR ALL ENTRIES 时性能会大幅下降(大约 5 倍):

在我的例子中,使用普通的 WHERE 子句读取数据大约需要 10 秒:

SELECT DISTINCT *
FROM ZMY_CDS_VIEW
WHERE prim_key_col eq 'mykey'
INTO TABLE @DATA(lt_table1).

在我的例子中,使用具有相同 WHEREFOR ALL ENTRIES 读取数据大约需要 50 秒:

"" boilerplate code that creates a table with one entry holding the same key value as above
TYPES: BEGIN OF t_kv,
  key_value like ZMY_CDS_VIEW-prim_key_col,
END OF t_kv.

DATA lt_key_values TYPE TABLE OF t_kv.
DATA ls_key_value TYPE t_kv.
ls_key_value-key_value = 'mykey'.
APPEND ls_key_value TO lt_key_values.
SELECT *
FROM ZMY_CDS_VIEW
FOR ALL ENTRIES IN @lt_key_values
WHERE prim_key_col eq @lt_key_values-key_value
INTO TABLE @DATA(lt_table2). 

我不明白为什么使用FOR ALL ENTRIES时相同的选择需要五倍的时间。由于表 lt_key_values 只有 1 个条目,我希望数据库(在我的例子中 sy-dbsys 是“DB6”)执行完全相同的操作,再加上一些小的操作可忽略不计的开销≪ 40 秒。

从底层 SQL View 而不是 CDS(及其访问控制等)中进行选择根本没有任何区别,添加或删除 DISTINCT 关键字也没有任何区别(因为 FOR所有条目意味着DISTINCT)。

最佳答案

一位同事猜测,FOR ALL ENTRIES实际上是选择CDS的全部内容,并在运行时将其与内表lt_key_values进行比较。这似乎是对的。

使用事务st05,我在FOR ALL ENTRIES 案例中记录了如下所示的 SQL 跟踪:

  SELECT
     DISTINCT "ZMY_UNDERLYING_SQL_VIEW".*
   FROM
     "ZMY_UNDERLYING_SQL_VIEW",
     TABLE( SAPTOOLS.MEMORY_TABLE( CAST( ? AS BLOB( 2G )) ) CARDINALITY 1 ) AS "t_00" ( "C_0" VARCHAR(30) )
   WHERE
         "ZMY_UNDERLYING_SQL_VIEW"."MANDT" = ?
     AND "ZMY_UNDERLYING_SQL_VIEW"."PRIM_KEY_COL" = "t_00"."C_0"

   [...]

Variables

   A0(IT,13)       = ITAB[1x1(20)]
   A1(CH,10)       = 'mykey'
   A2(CH,3)        = '100'

所以实际发生的情况是:ABAP 选择整个 CDS 内容并将内部表中的值放入类似附加列的内容中。然后它只保留内表和 SQL 结果条目匹配的那些值。 ==> 数据库级别没有优化 => 性能不佳。

关于db2 - 为什么 `FOR ALL ENTRIES` 会降低 DB6 上 CDS View 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56556437/

相关文章:

xslt - XSL : xpath not returning the right value

sql - 根据 ABAP Open SQL 中的列值仅从数据库表中选择一行

abap - SELECT 到具有 ABAP CDS 关联的结构化对象

abap - 从 ABAP CDS View 调用类方法?

c - DB2 表 C UDF DBINFO 和 SQLUDF_TRAIL_ARGS

java - 使用 DB2 的 JDBC 驱动程序时出现 ClassNotFoundException

java - 在 Mac OS X 上使用 DB2 和 jdbc

abap - 表表达式的最佳实践 (NW 7.4)

abap - 如何使用 ABAP CDS 实现 NOT EXISTS?

db2 - DB2 如何获取一个月的字符串值