Почему `FOR ALL ENTRIES` снижает производительность представления CDS на DB6? - PullRequest
6 голосов
/ 12 июня 2019

Я читаю данные из SAP Core Data Service (представление 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). 

Я не понимаю, почему при использовании * 1015 такой же выбор занимает в пять раз больше времени,Поскольку в таблице lt_key_values есть только 1 запись, я ожидаю, что база данных (sy-dbsys - это 'DB6' в моем случае) будет выполнять точно такие же операции плюс, возможно, небольшие незначительные накладные расходы - 40 с.

Выбориз базового представления SQL вместо CDS (с его контролем доступа и т. д.) вообще не имеет значения, равно как и добавление или удаление ключевого слова DISTINCT (поскольку FOR ALL ENTRIES подразумевает DISTINCT).

1 Ответ

2 голосов
/ 12 июня 2019

Коллега предположил, что FOR ALL ENTRIES фактически выбирает весь контент CDS и сравнивает его с внутренней таблицей lt_key_values во время выполнения.Это кажется правильным.

Использование транзакции st05 Я записал трассировку SQL, которая в случае FOR ALL ENTRIES выглядит следующим образом:

  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 совпадают.==> Без оптимизации на уровне базы данных => плохая производительность.

...