SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Как ускорить выборку из таблиц по JOIN



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 28, 2008 2:19 pm    Post subject: Как ускорить выборку из таблиц по JOIN Reply with quote

Понадобилось сделать такую выборку из таблиц MSEG и MKPF:

SELECT DISTINCT mkpf~mblnr mkpf~cpudt mkpf~cputm
mseg~charg mseg~vfdat mseg~matnr
INTO CORRESPONDING FIELDS OF TABLE itab
FROM mkpf INNER JOIN mseg ON mkpf~mblnr = mseg~mblnr
WHERE mseg~bwart IN ('Z61', 'Z62')
AND mkpf~cpudt = x_datum
AND mseg~matnr IN ('70537-405', '70024-110')
ORDER BY mseg~matnr mseg~charg mseg~vfdat.

Все работает нормально. Находит около 100 записей.
Теперь мне изменить условие выборки, поэтому заменяю строчку
AND mseg~matnr IN ('70537-405', '70024-110')
на AND mseg~matnr BETWEEN '70000-000' AND '70999-999'

Короче, получаю сообщение Time out. По-видимому, слишком много записей...
Можно ли как-то ускорить выборку, чтобы не было Time out?

В таблице MSEG нашел, что есть индекс Z1 (по MATNR).
Это может мне помочь? И если да, то как написать SELECT, чтобы учитывать этот индекс?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Jan 28, 2008 2:44 pm    Post subject: Reply with quote

Этот индекс, скорей всего и не подхватится для конструкции BETWEEN. Если в случае использования IN выборка проходит быстро, значит индекс работает.

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

И не используейте сортировку в селекте, если по полям нет индекса. Это нужно делать командой SORT по внутренней таблице.
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 28, 2008 3:04 pm    Post subject: Reply with quote

А как сделать потом фильтр? Я не совсем понял, что вы имеете в виду.
Сделать LOOP в itab и выбирать те позиции, где MATNR соответствует нужным условиям в новую таблицу itab_new?
Что-то вроде такого:

LOOP AT itab INTO wa.
IF WA-MATNR >= '70000-000' AND WA-MATNR <= '70999-999'.
APPEND wa TO itab_new.
ENDIF.
ENDLOPOP.

Или как-то иначе?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Jan 28, 2008 3:38 pm    Post subject: Reply with quote

Все зависит от того, как дальше используется внутренняя таблица. Если она нужна без этих записей, например для показа в ALV, то ненужные записи нужно удалить.
Или так, как это сделали Вы, или просто удалить ненужные.
Code:
DELETE itab WHERE matnr < '70000-000' AND matnr > '70999-999'.


Если же таблица нужна для промежуточной обработки, то
прямо так и пишите
Code:
LOOP AT itab INTO wa WHERE MATNR >= '70000-000' AND MATNR <= '70999-999'
 ...
ENDLOOP.
Back to top
View user's profile Send private message Blog Visit poster's website
dr.killer
Участник
Участник



Joined: 31 Oct 2007
Posts: 24
Location: 4.7, ECC 6.0

PostPosted: Mon Jan 28, 2008 7:40 pm    Post subject: Reply with quote

Можно попробовать так.

Code:

SELECT  mblnr
        cpudt
        cputm
FROM mkpf
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE cpudt = x_datum.

IF LINES( itab ) > 0.
  SELECT  mblnr
          charg
          vfdat
          matnr
   INTO CORRESPONDING FIELDS OF TABLE itab2
   FROM mseg
   FOR ALL ENTRIES IN itab
     WHERE   mblnr = itab-mblnr AND
             bwart IN ('Z61', 'Z62') AND
             matnr BETWEEN '70000-000' AND '70999-999'.
  IF sy-subrc = 0.
    SORT itab2 BY matnr charg vfdat.
    LOOP AT itab2 ASSIGNING <fs_itab>.
      READ TABLE itab INTO wa_itab2 WITH KEY mblnr = <fs_itab>-mblnr.
      IF sy-subrc = 0.
        <fs_itab>-cpudt = wa_itab2-cpudt.
        <fs_itab>-cputm = wa_itab2-cputm.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDIF.

где itab2 и <fs_itab> того же типа что и itab


Last edited by dr.killer on Mon Jan 28, 2008 7:46 pm; edited 1 time in total
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 46
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Mon Jan 28, 2008 7:43 pm    Post subject: Reply with quote

dr.killer wrote:
Можно попробовать так, будет быстрее раза в 2 минимум.

+1. При больших объемах данных цикл по внутренним таблицам лучше организовывать через филд-симболы.
Back to top
View user's profile Send private message Blog
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Jan 28, 2008 7:44 pm    Post subject: Reply with quote

спасибо, завтра попробую.
А как именно продекларировать этот <fs_itab> ?
Я пока еще с этим типом не работал
Back to top
View user's profile Send private message
dr.killer
Участник
Участник



Joined: 31 Oct 2007
Posts: 24
Location: 4.7, ECC 6.0

PostPosted: Mon Jan 28, 2008 7:48 pm    Post subject: Reply with quote

cbw07 wrote:
спасибо, завтра попробую.
А как именно продекларировать этот <fs_itab> ?
Я пока еще с этим типом не работал

FIELD-SYMBOLS: <fs_itab> TYPE ty_my.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.