Медленный ВЫБРАТЬ ДЛЯ ВСЕХ ЗАПИСЕЙ - PullRequest
3 голосов
/ 22 апреля 2019

Приведенный ниже SELECT работает с внутренней таблицей GIT_KUNNR_TAB, содержащей 2,291 000 строк с уникальными клиентами (kunnr), и занимает 16 минут.

  select kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
           zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
        into corresponding fields of table git_oi_tab
      from bsid
        for all entries in git_kunnr_tab
      where bukrs  =  p_bukrs
        and kunnr  =  git_kunnr_tab-kunnr 
        and umsks  = ' '
        and augdt  =   clear_augdt
        and budat  le  p_key 
        and blart  in  s_blart
        and xref3  in  s_xref3.

BSID содержит в общей сложности 20 000 000 записей идля 2.291.000 уникальных клиентов он получает 445.000 записей из BSID.

В большинстве случаев в GIT_KUNNR_TAB.

есть еще больше строк. Есть ли более быстрый выбор?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Удалите часть FOR ALL ENTRIES

Скорее всего, остальное условие ГДЕ достаточно избирательно. Вы получаете больше записей, чем необходимо, но намного быстрее.

Поскольку git_kunnr_tab уникален, вы можете превратить его в HASHED-таблицу и отфильтровать git_oi_tab с этим на сервере приложений.

SELECT kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
       zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
    INTO corresponding fields of table git_oi_tab
    FROM bsid
    WHERE bukrs = p_bukrs 
      AND umsks = ' ' 
      AND augdt = clear_augdt 
      AND budat le p_key 
      AND blart in s_blart 
      AND xref3 in s_xref3.

DATA: lt_kunnr_tab TYPE HASHED TABLE of <type of git_kunnr_tab>
          WITH UNIQE KEY kunnr.
lt_kunnr_tab = git_kunnr_tab.
LOOP AT git_oi_tab ASSIGNING FIELD-SYMBOL(<fs_oi>).
  READ TABLE lt_kunnr_tab TRANSPORTING NO FIELDS
      WITH KEY kunnr = <fs_oi>-kunnr.
    IF sy-subrc <> 0
      DELETE git_oi_tab.
    ENDIF.
  ENDIF.
ENDLOOP.
FREE lt_kunnr_tab.

Это , а не общее решение

Если в таблице драйверов FAE содержится более 20% строк таблицы назначения, полное ее удаление в основном выгодно для скорости.
Если в нем меньше строк, FAE - лучшее решение.

Удаление FAE может значительно увеличить потребление памяти в результирующей внутренней таблице.

ДЛЯ ВСЕХ ЗАПИСЕЙ против таблицы диапазона

В Интернете можно увидеть множество мест, где Таблицы диапазонов быстрее, чем FAE. Это верно в некоторых очень специфических случаях:

  • В таблице драйверов FAE используется только одно поле
  • В таблице драйверов больше строк, чем отправляет FAE за один пакет
    • По умолчанию размер пакета равен 5 в Oracle, 50 в DB2, 100 в HANA
  • В таблице Range не так много строк, чтобы вызывать дамп
    • Максимальная длина составляет 1 048 576 байт (примечание 1002491)

Таблицы диапазонов могут быть быстрее, чем FAE, поскольку они отправляют все условия фильтрации в одном запросе. Это, конечно, источник опасности, поскольку размер запроса ограничен. Если он превышает установленный лимит, вы получаете дамп.

Однако, используя подсказки MAX_IN_BLOCKING_FACTOR и MAX_BLOCKING_FACTOR, вы можете дать FAE все преимущества таблиц диапазонов, без его недостатков, увеличив размер пакета.

Поэтому используйте только Таблицы диапазонов с фактическими диапазонами , как между A и C, или нет между G и J.

0 голосов
/ 22 апреля 2019

Обычно только для одного поля использование диапазона происходит намного быстрее. Поэтому, если вы выбираете данные по некоторому ключу из внутренней таблицы, сравнивая только одно поле из таблицы, включите их в диапазон вместо FAE:

TYPES:
  tr_kunnr TYPE RANGE OF kunnr.

* or just do loop/append if you on the old system (>7.4)
DATA(lr_kunnr) = VALUE tr_kunnr(
  FOR <fs_oi> IN git_oi_tab
  (
    sign    = 'I'
    option  = 'EQ'
    low     = fs_oi-kunnr
  )
). 

 select kunnr umsks umskz gjahr belnr buzei bschl shkzg dmbtr bldat
           zfbdt zbd1t zbd2t zbd3t rebzg rebzj rebzz rebzt
        into corresponding fields of table @git_oi_tab
      from bsid
      where bukrs  =  @p_bukrs
        and kunnr  in @lr_kunnr...

Я не могу найти статью, но было проведено расследование, и в случае сравнения одного поля диапазон намного быстрее, чем в FAE.

...