Таблица для чтения лучших практик в S / 4 Hana - PullRequest
0 голосов
/ 23 июня 2019

Я нашел программу, где в цикле из ста записей они выбирают из 12 разных таблиц описание значения поля (например, umskz, fdgrv и т. Д.).
Я знаю, что лучше всего брать описания, когда я получаю значения этих полей через соединение.
Но если по какой-то причине я не хочу поступать так, какова следующая лучшая практика для получения описаний?
Выбирая из таблиц для каждой записи? или
загрузив их в ITAB, и для каждой записи прочитайте ITAB и получите описания?
Конечно, когда я закончу получать описания вторым способом, я освобожу ITAB.

Я с нетерпением жду ваших мнений.

Спасибо
Элиас

1 Ответ

3 голосов
/ 24 июня 2019

Ваш вопрос немного нечеткий, поэтому позвольте мне сначала подвести итог того, что я понимаю:

Вы хотите выбрать большой набор данных с записями 1M из одной "центральной" таблицы.Данные имеют 11 столбцов, которые содержат коды.Вы хотите присоединиться к описаниям этих кодов.

Ваша установка звучит как схема типа "звезда".Наилучшим вариантом, особенно в SAP S / 4 HANA, обычно будет создание представления CDS, которое описывает требуемые объединения и производит вывод именно той формы, которая вам нужна.Это позволяет базе данных выполнять дорогостоящие вычисления пути выполнения задолго до выбора данных и, таким образом, позволяет базе данных выбирать оптимальный способ предоставления вам данных.

Второй наиболее эффективный способ сделать это с SAPHANA будет представлять собой один OpenSQL SELECT, который объединяет все данные с LEFT OUTER объединяет за один шаг.Вы уже нашли это самостоятельно, но позвольте мне повторить это в псевдокоде для ясности:

SELECT 
    <central table>-<field list>,
    <first code table>-description AS description_1,
    ...
    <eleventh code table>-description AS description_11
  INTO TABLE DATA(data)
  FROM <central table>
  LEFT OUTER JOIN <first code table>
    ON <central table>-<first code field> = <first code table>-key
  ...
  LEFT OUTER JOIN <eleventh code table>
    ON <central table>-<eleventh code field> = <eleventh code table>-key.

Третий лучший выбор, о котором вы изначально просите, обычно состоит в предварительном выбореосновные данные, за которыми следуют последующие выборы описаний кода, а также окончательное «соединение» в ABAP.Таблицы диапазонов могут упростить выбор необходимых кодов.Таблицы SORTED могут гарантировать, что объединение обеспечивает приемлемую производительность:

" select the main data
SELECT <central table>-<field list>
  FROM <central table>
  INTO CORRESPONDING FIELDS OF TABLE data.

" collect the codes
LOOP AT data REFERENCE INTO DATA(record).

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<first code field> )
    INTO TABLE first_codes_range.

  ...

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<eleventh codde field> )
    INTO TABLE eleventh_codes.

ENDLOOP.

" select the descriptions
SELECT <key>, description
  FROM <first code table>
  INTO TABLE first_descriptions
  WHERE <key> IN first_codes.

...

SELECT <key>, description
  FROM <eleventh code table>
  INTO TABLE eleventh_descriptions
  WHERE <key> IN eleventh_codes.

" join main data and descriptions
LOOP AT data REFERENCE INTO record.
  record->description_1 =
    first_descriptions[ <key> = record-><first code field> ]-description.
  ...
  record->description_11 =
    eleventh_descriptions[ <key> = record-><eleventh code field> ]-description.
ENDLOOP.

Как отмечает @Sandra Rossi, производительность - это очень индивидуальная вещь, которая стоит и падает с крошечными деталями и часто не поддается рекомендациям.Как следствие, эти предложения могут быть только такими: предложения.Программисты, которые написали 13-часовую работу, которую вы улучшаете, вероятно, следовали своим лучшим практикам тогда ...

...