Используют ли службы времени выполнения (RTTS) базу данных для получения описаний данных? - PullRequest
0 голосов
/ 02 июля 2018

Вопрос

Получают ли такие методы, как describe_by_data, get_ddic_field_list, get_components (из cl_abap_typedescr и аналогичные), данные из базы данных или они генерируются на сервере приложений?

Я посмотрел на эти классы, и все некоторые методы (предположительно, заполняющие кэш), по-видимому, извлекают данные нестандартными способами (METHOD ... BY KERNEL MODULE ...), а другие извлекают данные из кеша. Мне интересно, как оно вытягивается, если оно не кэшируется.

Google также не дал мне никакой конкретной информации по этой теме.

Некоторый контекст, если подробности становятся актуальными

Я пытался реализовать генерацию динамических предложений выбора для некоторых универсальных классов (чтобы заменить звездочку для обработки на основе столбцов в S / 4HANA и, надеюсь, уменьшить нагрузку на БД).

Поскольку большинство этих классов извлекают данные в структуры типа словаря, я подумал, что мог бы использовать описания типов Runtime Type Services (RTTS) для получения списков полей и динамического генерирования предложения select на основе целевой структуры.

В большинстве случаев я могу обойти потерю производительности (если она есть), применяя статические переменные (и обрабатывая их только один раз за сеанс), но я сталкивался с подобными случаями, когда статические переменные были недоступны (обработка сделано на неизвестных типах), и мне пришлось отказаться от этой идеи, потому что я не был уверен, как это повлияет на пиковую производительность, если эти методы будут вызваны, скажем, 30 раз за сеанс.

Редактировать (просто фрагмент кода, чтобы избежать дальнейшей путаницы, которая приводит к снисходительным комментариям без содержания):

lo_struct ?= cl_abap_structdescr=>describe_by_data( header ).
ct_components = lo_struct->get_components( ).
"Loop through ct_components appending names to lv_select_clause

lv_select_clause = get_header_fields( is_target_structure = header ).
select single (lv_select_clause)
  from rbkp
  where gjahr = @iv_gjahr
    and belnr = @iv_belnr
  into corresponding fields of @header.

1 Ответ

0 голосов
/ 02 июля 2018

Я не могу быть уверен в последних версиях ABAP, но этот словарь ABAP (AKA "DDIC" для словаря данных) происходит из таблиц базы данных DDNTT и DDNTF (также называемых "nametab", и их элементов называются «объектами времени выполнения базы данных») , которые заполняются во время активации объектов DDIC (таблицы и т. д., эти таблицы имеют вид DD02L, DD03L, как сказано @icbytes и т. д.).

Когда они запрашиваются, они также передаются и сохраняются в памяти каждого сервера приложений. Эта память называется nametab buffer . Самые новые данные заменяют самые старые данные, когда буфер заполнен.

Нет представления о производительности, но нет сомнений в том, что ею можно пренебречь по сравнению с SELECT, который вы делаете сразу после.

Еще одна вещь, касающаяся RTTS, всегда используют методы GET_ * , а не методы CREATE_ *, потому что они быстрее (они ведут себя немного по-другому, но обычно только последним опытным разработчикам могут понадобиться последние). ).

Если вы хотите, вы можете добавить еще один слой памяти, но я думаю, что это не стоит делать (больше затрачивается времени на разработку + больше потребляемой памяти по сравнению с отсутствием значительного улучшения производительности).

...