Posted: Tue Oct 28, 2008 3:31 am Post subject: вопрос от чайника: что быстрее работает?
Что быстрее работает:
1. если сделать один select по всем нужным таблицам с помощью inner join и скинуть все данные во временную таблицу, а потом делать цикл по временной таблице.
2. Или же сделать вложенные select end select и внутри них обрабатывать данные?
В общем случае предпочтительнее вариант с внутренней таблицей, но все зависит от конкретных условий - предполагаемого количества записей, количества таблиц, времени обработки и тд. Самое лучшее для вас - попробовать оба ваших варианта и еще третий: не пихать все в один запрос с join'ами, а попробовать разделить их на несколько, и посмотреть в SE30 сколько занимает времени обработка каждого варианта
моя проблема в том , что оба варианта работают очень долго...я размещу код, если у вас будет время, посмотрите, плиз :
select MSEG~MATNR MSEG~MBLNR MSEG~BWART MSEG~WERKS MSEG~WAERS MSEG~LGORT MSEG~DMBTR MSEG~MENGE MSEG~ERFME MSEG~SHKZG MSEG~PRCTR MKPF~BUDAT
MARA~MATKL MARA~BRGEW MAKT~MAKTX
into corresponding fields of table osn_tbl
from MKPF inner join MSEG on MKPF~MBLNR = MSEG~MBLNR
inner join MARA on MARA~MATNR = MSEG~MATNR
inner join MAKT on MAKT~MATNR = MSEG~MATNR
where MKPF~BUDAT IN SBUDAT
and ( MSEG~BWART = 'Z01' or ( MSEG~BWART = 'Z02' and MSEG~SMBLN <> '' ) )
and MSEG~WERKS IN SWERKS
and MSEG~PRCTR in SLGORT
and MSEG~MATNR in SMATNR
and MARA~MATKL IN SMATKL.
.
второй вариант
SELECT * FROM MKPF WHERE BUDAT IN SBUDAT.
SELECT * FROM MSEG
WHERE MBLNR = MKPF-MBLNR AND ( BWART = 'Z01' or ( BWART = 'Z02' and smbln <> '' ) ) AND WERKS IN SWERKS and PRCTR IN slgort
.
SELECT * FROM mara WHERE matkl IN smatkl AND MATNR = MSEG-MATNR .
ENDSELECT.
*наим
SELECT * FROM MAKT WHERE MATNR = MSEG-MATNR.
YPP_VIPUSK-MAKTX = MAKT-MAKTX.
ENDSELECT.
SELECT * FROM T001W WHERE WERKS = MSEG-WERKS.
VKORG_ = T001W-VKORG.
ENDSELECT.
*цена
SELECT * FROM A950 WHERE KAPPL = 'V' AND KSCHL = 'VKP0' AND VKORG = VKORG_
AND VTWEG = '01' AND WERKS = MSEG-WERKS
AND MATNR = YPP_VIPUSK-MATNR AND DATaB <= mkpf-BUDAT and DATBI >= mkpf-BUDAT.
Я к сожалению с MM особо не работал, так глядя на запрос сказать не могу, надо это проверять у вас в трассировщике. Но второй вариант с SELECT..ENDSELECT думаю можете однозначно выкинуть
Age: 165 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Tue Oct 28, 2008 11:27 am Post subject:
В системе должен быть индекс MSEG~M (Material documents for material ), попробуйте его использовать:
Code:
SELECT mseg~matnr
mseg~mblnr
mseg~bwart
mseg~werks
mseg~waers
mseg~lgort
mseg~dmbtr
mseg~menge
mseg~erfme
mseg~shkzg
mseg~prctr
mkpf~budat
mara~matkl
mara~brgew
makt~maktx
INTO CORRESPONDING FIELDS OF TABLE osn_tbl
FROM mseg
INNER JOIN mkpf ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr
INNER JOIN mara ON mara~matnr = mseg~matnr
INNER JOIN makt ON makt~matnr = mseg~matnr
WHERE mseg~matnr IN smatnr
AND mseg~werks IN swerks
AND ( mseg~bwart = 'Z01'
OR ( mseg~bwart = 'Z02' AND mseg~smbln <> '' ))
AND mseg~prctr IN slgort
AND mkpf~budat IN sbudat
AND mara~matkl IN smatkl.
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Tue Oct 28, 2008 3:54 pm Post subject: Re: вопрос от чайника: что быстрее работает?
ablinka wrote:
Что быстрее работает:
1. если сделать один select по всем нужным таблицам с помощью inner join и скинуть все данные во временную таблицу, а потом делать цикл по временной таблице.
2. Или же сделать вложенные select end select и внутри них обрабатывать данные?
Вложенные SELECT ... ENDSELECT лучше сразу забыть - используйте вместо этого SELECT ... INTO TABLE, LOOP ... ENDLOOP.
При выборе inner join vs select по отдельным таблицам нужно учитывать следующие обстоятельства:
1.Если соединение идет с настроечными таблицами (имя таблицы T*), то join не нужен, т.к. настроечные таблицы в большинстве своем буферизируются на уровне Application server.
2.Если идет соединение с таблицами основных данных (MARA, MAKT), то вместо join лучше использовать select single + сортированную внутреннюю таблицу:
Code:
DATA: begin of gs_mara,
matnr TYPE mara-matnr,
matkl TYPE mara-matkl,
maktx TYPE makt-maktx,
end of gs_mara,
gt_mara LIKE SORTED TABLE OF gs_mara WITH UNIQUE KEY matnr.
...
LOOP AT gt_data ASSIGNING <fs_data>.
PERFORM get_mara USING <fs_data>.
...
ENDLOOP.
....
FORM get_mara USING p_data LIKE gs_data.
READ TABLE gt_mara INTO gs_mara WITH KEY matnr = p_data-matnr.
IF sy-subrc <> 0.
CLEAR gs_mara.
gs_mara-matnr = p_data-matnr.
SELECT SINGLE matkl
INTO gs_mara-matkl
FROM mara
WHERE matnr = gs_mara-matnr.
IF sy-subrc = 0.
SELECT SINGLE maktx
INTO gs_mara-maktx
FROM makt
WHERE matnr = gs_mara-matnr
AND spras = sy-langu.
ENDIF.
INSERT gs_mara INTO TABLE gt_mara.
ENDIF.
MOVE-CORRESPONDING gs_mara TO p_data.
ENDFORM.
....
3. Если поле из справочника участвует в ограничении значений, можно поступить 2-мя способами:
а) Если ограничение позволяет выбрать мало записей из правочника и является обязательным, то вначале нужно выбрать данные из справочника по условию во внутреннюю таблицу или RANGE, затем делать выборку по основной таблице
б) Если ограничение не является обязательным и с его помощью нельзя сильно ограничить выборку, то данные выбираются, как в п.2, но в цикле после заполнения полей из справочника удаляются данные, не соответствующие ограничению на экране выбора.
4.Если выборка должна быть из 2-х таблиц с переменными данными, и условие соединения включает в себя первичный ключ или содержится в каком-либо индексе, то лучше применять JOIN (как пример - таблицы MKPF, MSEG)
5. По возможности не используйте конструкции OR в условиях выборки _________________ С уважением,
Удав.
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Tue Oct 28, 2008 7:11 pm Post subject:
John Doe, это из личного опыта
Отчеты по документам материала за месяц:
SELECT SINGLE MARA + SELECT SINGLE MAKT = 692 милисекунды на запись
SELECT SINGLE MARA join MAKT = 602 милисекунды на запись
Можно еще уменьшить время выборки
SELECT ... MARA FOR ALL ENTRIES join MAKT = 380 милисекунды
Но этот способ не очень красивый с точки зрения реализации, когда в рамках одной записи в основных данных есть несколько полей с номерами материалов, например в случае отчетов по перемещениям материала может быть задействовано не только поле MSEG-MATNR, но и MSEG-UMMAT.
Выделение из join MKPF+MSEG таблиц MARA и MAKT дало прирост производительности ~30%.
Возможно, причина еще и в том, что таблицы настройки, таблицы основных данных и таблицы переменных данных лежат в разных tablespace.
Во всех отчетах выборка из MARA+MAKT не превышает 3% от общего выполнения программы. В случае с select single - вообще 0,3% _________________ С уважением,
Удав.
Posted: Fri Mar 13, 2009 4:10 pm Post subject: Re: вопрос от чайника: что быстрее работает?
ablinka wrote:
Что быстрее работает:
1. если сделать один select по всем нужным таблицам с помощью inner join и скинуть все данные во временную таблицу, а потом делать цикл по временной таблице.
2. Или же сделать вложенные select end select и внутри них обрабатывать данные?
Сделать ракурс БД с нужным join и из него делать селехт, работает очень быстро.
Posted: Fri Mar 13, 2009 4:36 pm Post subject: Re: вопрос от чайника: что быстрее работает?
fashionPunk wrote:
Сделать ракурс БД с нужным join и из него делать селехт, работает очень быстро.
Вы уверены?
Насколько я помню - у вьюхи есть небольшое преимущество в скорости за счет того, что план запроса хранится в готовом виде, но кардинально это проблему скорости не решает. Тяжелый и большой запрос - он и есть большой и тяжелый, в каком бы виде он не выполнялся
Posted: Fri Mar 13, 2009 4:53 pm Post subject: Re: вопрос от чайника: что быстрее работает?
Armann wrote:
fashionPunk wrote:
Сделать ракурс БД с нужным join и из него делать селехт, работает очень быстро.
Вы уверены?
Насколько я помню - у вьюхи есть небольшое преимущество в скорости за счет того, что план запроса хранится в готовом виде, но кардинально это проблему скорости не решает. Тяжелый и большой запрос - он и есть большой и тяжелый, в каком бы виде он не выполнялся
ну вот относительно недавно оптимизировал одну программу с join по 4 таблицам, сдлал на ракурсе, время выполнения существенно уменьшилось на процентов 20
Posted: Fri Mar 13, 2009 5:33 pm Post subject: Re: вопрос от чайника: что быстрее работает?
fashionPunk wrote:
ну вот относительно недавно оптимизировал одну программу с join по 4 таблицам, сдлал на ракурсе, время выполнения существенно уменьшилось на процентов 20
Трудно тут что нить сказать без планов запросов до оптимизации и после. Рискну все же предположить что ускорение связано не с переделкой в ракурс, а с тем, что после переделки оптимизатор стал выбирать более удачную стратегию
2All. В MS SQL вроде как можно создавать индексы к вьюхам. Интересно, на Сап это какое нить влияние оказывает? Строится ли каким либо образом такой индекс, или 'не положено - значит неположено'?
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.