我正在使用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}}。
答案 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结果条目确实匹配的那些值。 ==>在数据库级别没有优化=>性能不佳。