Загрузить всю таблицу базы данных, затем отфильтровать в памяти или загрузить только отфильтрованные записи? - PullRequest
0 голосов
/ 03 марта 2019

Мне нужно запрограммировать поиск клиентов из базы данных.

Я знаю, что базы данных предназначены для управления огромными объемами данных.Но мой «наставник» сказал мне, чтобы я как можно меньше взаимодействовал с БД.

Лучше ли считать всю таблицу базы данных во внутреннюю таблицу и затем отфильтровать ее по параметрам, введенным пользователем:

SELECT * FROM customer INTO TABLE it_customer.

LOOP AT it_customer INTO wa.
      WHERE .... IN ...
  APPEND wa TO output.
ENDLOOP.

Или просто сделать прямой доступ к таблице базы данных?

SELECT * FROM customer 
      INTO wa
      WHERE ... in ...
  APPEND wa TO output.
ENDSELECT.

Ответы [ 4 ]

0 голосов
/ 05 марта 2019
SELECT the, fields, you, really, need
  FROM customer
  INTO TABLE @DATA(customers)
  WHERE some_attribute = @some_value
    OR some_id IN @some_range.

Если количество записей огромно, вы можете обработать данные в пакетах:

SELECT the, fields, you, really, need
  FROM customer
  INTO TABLE @DATA(customers)
  WHERE some_attribute = @some_value
    OR some_id IN @some_range
  PACKAGE SIZE 1024.

  " some processing

ENDSELECT
  • Считайте как можно больше записей за один шаг, чтобы сохранить количество записей.как минимум дорогие обходы базы данных.
  • ВЫБИРАЙТЕ только действительно необходимые столбцы и используйте ГДЕ, чтобы минимизировать объем памяти и объем данных, которые необходимо передать.
0 голосов
/ 03 марта 2019

Используйте SELECT ... INTO TABLE

Когда вы получите лучшего наставника 1 , вам будет намного легче реорганизовать ваш код в нечто разумное.

Только , если it_customer вызывает дамп памяти, если вы используете SELECT ... ENDSELECT.


1) или DBA или CTO, кто бы ни был ответственен за текущий, очень плохая политика

0 голосов
/ 04 марта 2019

Основным принципом, который SAP указывает в своих заметках о производительности , является:

Сохраняйте число обращений низким

, что означает условие WHEREНИКОГДА не должно быть пустым, как вы собираетесь делать.Никогда не читайте всю базу данных.

Сохраняйте количество операций чтения низким * Принцип 1012 * только на третьем месте, то есть он менее важен для огромных объемов данных.Но также вы не должны злоупотреблять этим и никогда не должны использовать DB-операции в циклах, как это делает ваш второй вариант, если вы не делаете что-то особенное с некоторыми особыми требованиями.

Скажем больше, ваш код нарушает Сохраняйте объем данных на низком уровне , так как вы выбираете все столбцы вместо необходимых.Избегайте использования * в SELECT, если вы действительно не используете все столбцы.

Поэтому ответ таков: используйте 1-й фрагмент кода (но с WHERE в SELECT!), Это было бы более эффективно.В большинстве случаев операции ABAP обходятся дешевле, чем операции с БД.

Полезный блог на эту тему:

https://blogs.sap.com/2014/05/21/a-complete-guide-to-opensql-statements-step-by-step-tutorial-with-screenshots/

0 голосов
/ 03 марта 2019

Это правда, что доступ к БД считается дорогостоящим действием.Правильное обращение к БД абсолютно повысит производительность вашей системы.

Как правило, сокращение числа обращений к БД является хорошей отправной точкой.Однако это не единственное, что следует учитывать в уравнении " правильный путь ".

Давайте рассмотрим, в частности, в вашем случае:

* A single DB access:
SELECT * 
  FROM customer
  INTO CORRESPONDING FIELDS OF TABLE @lt_customer. 

* Then some manipualtion.
* ...

Подводные камни:

  1. Поток данных из БД на сервер приложений, как сказано, дорог.Не только количество обращений является фактором, но также и количество данных , которые передаются.Если не все клиенты нужны (скажем, для экрана личной информации о клиенте), это приведет к значительным накладным расходам на перенос всех остальных ненужных клиентов на сервер приложений.
  2. Выбор всей таблицы может быть приемлемым, если это сделано только один раз.Скажи в начале вашего процесса.Однако во многих процессах БД изменяется в середине процесса (например, если это обзорный экран всех клиентов).В этом случае вам придется обновить данные, и сделать это с другим select * может быть неправильно.
  3. Доступ к БД действительно дорог, но внутренние манипуляции также не бесплатны.Выполнение select * даст начало N строк в lt_customer, когда N - количество записей в таблице БД клиента.Иногда неизбежно производить вычисления в порядке n^2 или даже больше.По мере роста N время на его обработку возрастает.

Сейчас у меня нет времени.Я постараюсь расширить, когда у меня будет больше времени.Удачи.

PS SELECT... ENDSELECT. считается плохой практикой.Вы можете прочитать об этом в примере здесь .

...