Posted: Mon Jan 28, 2008 2:19 pm Post subject: Как ускорить выборку из таблиц по JOIN
Понадобилось сделать такую выборку из таблиц 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, чтобы учитывать этот индекс?
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Mon Jan 28, 2008 2:44 pm Post subject:
Этот индекс, скорей всего и не подхватится для конструкции BETWEEN. Если в случае использования IN выборка проходит быстро, значит индекс работает.
Ваш селекс правильный, но видимо придется искать другой алгоритм. Например, сначала выбрать все данные во внутреннюю таблицу с ограничением по дате (за один день документов не должно быть много), а потом уже делать фильтр по материалу по внутренней таблице.
И не используейте сортировку в селекте, если по полям нет индекса. Это нужно делать командой SORT по внутренней таблице.
А как сделать потом фильтр? Я не совсем понял, что вы имеете в виду.
Сделать 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.
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Mon Jan 28, 2008 3:38 pm Post subject:
Все зависит от того, как дальше используется внутренняя таблица. Если она нужна без этих записей, например для показа в 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.
Joined: 31 Oct 2007 Posts: 24 Location: 4.7, ECC 6.0
Posted: Mon Jan 28, 2008 7:40 pm Post subject:
Можно попробовать так.
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
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.