为什么“ FOR ALL ENTRIES”会降低DB6上CDS视图的性能?

时间:2019-06-12 07:05:56

标签: db2 sap abap cds

我正在使用SAP核心数据服务(CDS视图,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).

在我的情况下,使用FOR ALL ENTRIES和相同的WHERE读取数据大约需要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')执行完全相同的操作,外加一些小的可忽略的开销≪ 40s。

从基础SQL视图中选择而不是从CDS(具有其访问控制等)进行选择根本没有区别,添加或删除DISTINCT关键字也没有任何区别(因为FOR ALL ENTRIES意味着{ {1}}。

1 个答案:

答案 0 :(得分:2)

一位同事猜测,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结果条目确实匹配的那些值。 ==>在数据库级别没有优化=>性能不佳。