Posted: Tue Aug 11, 2009 9:36 am Post subject: Оптимизация скорости селекта
Здравствуйте!
Что можно с этим select сделать для увеличения скорости?
Code:
CONSTANTS: c_fkart_zf5 TYPE vbrk-fkart VALUE 'ZF5'.
SELECT vbrp~vbeln
vbrp~posnr
vbrk~fkart
vbrk~fkdat
vbrk~netwr
vbrk~waerk
vbrk~kunag
vbrk~bukrs
vbrk~xblnr
vbrp~matnr
vbrp~arktx
vbrp~fkimg
vbrp~vrkme
vbrp~ktgrm
likp~kunnr
lips~mtart
INTO CORRESPONDING FIELDS OF TABLE lt_int
FROM vbrp
INNER JOIN vbrk ON vbrk~vbeln = vbrp~vbeln
INNER JOIN vbfa ON vbfa~vbeln = vbrp~vbeln
AND vbfa~posnn = vbrp~posnr
INNER JOIN lips ON lips~vbeln = vbfa~vbelv
AND lips~posnr = vbfa~posnv
INNER JOIN likp ON likp~vbeln = lips~vbeln
WHERE vbrk~vkorg = p_vkorg
AND vbrk~vtweg = p_vtweg
AND vbrk~spart = p_spart
AND vbrk~fkdat IN s_fkdat
AND vbrk~fkart <> c_fkart_zf5
AND vbrk~bukrs = p_bukrs
AND likp~kunnr IN s_kunnr
AND lips~mtart IN s_mtart.
Posted: Tue Aug 11, 2009 12:47 pm Post subject: Re: Оптимизация скорости селекта
RA wrote:
А план запроса можно?
Quote:
SELECT T_00 ."VBELN" AS c,T_00 ."POSNR" AS c,T_01 ."FKART" AS c,T_01 ."FKDAT" AS c,T_01 ."NETWR" AS c,T_01 ."WAERK" A
S c,T_01 ."KUNAG" AS c,T_01 ."BUKRS" AS c,T_01 ."XBLNR" AS c,T_00 ."MATNR" AS c,T_00 ."ARKTX" AS c,T_00 ."FKIMG"
AS c,T_00 ."VRKME" AS c,T_00 ."KTGRM" AS c,T_04 ."KUNNR" AS c,T_03 ."MTART" AS c FROM ( ( ( ( "VBRP" T_00 INNE
R JOIN "VBRK" T_01 ON T_01 ."MANDT" = '900' AND T_01 ."VBELN" = T_00 ."VBELN" ) INNER JOIN "VBFA" T_02 ON T_02
."MANDT" = '900' AND T_02 ."VBELN" = T_00 ."VBELN" AND T_02 ."POSNN" = T_00 ."POSNR" ) INNER JOIN "LIPS" T_03 O
N T_03 ."MANDT" = '900' AND T_03 ."VBELN" = T_02 ."VBELV" AND T_03 ."POSNR" = T_02 ."POSNV" ) INNER JOIN "LIKP"
T_04 ON T_04 ."MANDT" = '900' AND T_04 ."VBELN" = T_03 ."VBELN" ) WHERE T_00 ."MANDT" = '900' AND T_01 ."VKO
RG" = 'KZ01' AND T_01 ."VTWEG" = '13' AND T_01 ."SPART" = '00' AND T_01 ."FKDAT" BETWEEN '20090409' AND '200
90410' AND T_01 ."FKART" <> 'ZF5 ' AND T_01 ."BUKRS" = '1079' AND T_03 ."MTART" IN ( 'ZVAR' , 'ZRLF' ) /* ZE
KZSR_SHIP_COST_CALC 55 */
SELECT
Nested Loops(Inner Join, OUTER REFERENCES:( T_03.VBELN ))
log.op: Inner Join phys.op: Nested Loops
Nested Loops(Inner Join, OUTER REFERENCES:( T_02.VBELV , T_02.POSNV ))
log.op: Inner Join phys.op: Nested Loops
Nested Loops(Inner Join, OUTER REFERENCES:( T_00.POSNR , T_01.VBELN ))
log.op: Inner Join phys.op: Nested Loops
Nested Loops(Inner Join, OUTER REFERENCES:( T_01.VBELN ))
log.op: Inner Join phys.op: Nested Loops
Clustered Index Seek( VBRK.VBRK~0 AS T_01 ), SEEK:( T_01.MANDT ='900'), WHERE:( ECD.dbo.VB
RK.VKORG as T_01.VKORG ='KZ01' AND ECD.dbo.VBRK.VTWEG as T_01.VTWEG ='13' AND ECD.dbo.VB
log.op: Clustered Index Seek phys.op: Clustered Index Seek
Clustered Index Seek( VBRP.VBRP~0 AS T_00 ), SEEK:( T_00.MANDT ='900' AND T_00.VBELN = ECD
.dbo.VBRK.VBELN as T_01.VBELN ) ORDERED FORWARD)
log.op: Clustered Index Seek phys.op: Clustered Index Seek
Index Seek( VBFA.VBFA~ZM1 AS T_02 ), SEEK:( T_02.MANDT ='900' AND T_02.VBELN = ECD.dbo.VBRK.VBE
LN as T_01.VBELN ), WHERE:( ECD.dbo.VBFA.POSNN as T_02.POSNN = ECD.dbo.VBRP.POSNR as
log.op: Index Seek phys.op: Index Seek
Clustered Index Seek( LIPS.LIPS~0 AS T_03 ), SEEK:( T_03.MANDT ='900' AND T_03.VBELN = ECD.dbo.VBFA.
VBELV as T_02.VBELV AND T_03.POSNR = ECD.dbo.VBFA.POSNV as T_02.POSNV ), WHERE:( ECD.
log.op: Clustered Index Seek phys.op: Clustered Index Seek
Clustered Index Seek( LIKP.LIKP~0 AS T_04 ), SEEK:( T_04.MANDT ='900' AND T_04.VBELN = ECD.dbo.LIPS.VBELN
as T_03.VBELN ) ORDERED FORWARD)
log.op: Clustered Index Seek phys.op: Clustered Index Seek
RA wrote:
У Вас нет ограничений в WHERE для vbrp
Может создать индекс для vbrk по WHERE и к нему JOIN ить остальные таблицы?
Code:
SELECT ...
FROM vbrk AS k
INNER JOIN vbrp AS p ON k~vbeln = p~vbeln
...
Создание индекса конечно решит проблему, но для одного отчета создавать индекс для часто используемой таблицы с инвойсами... не хотца.
Fami4 wrote:
stn, вы ведь подымали вопрос по поводу join,может сделать как тут говорят:
Ну там же о другом речь, хотя таблицы пересекаются.
Age: 165 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Tue Aug 11, 2009 12:58 pm Post subject:
Без индексов по vbrk, думаю все равно full scan получите. Чисто теоретически, так не будет быстрее?
Code:
DATA: BEGIN OF lt_vbrk OCCURS 0,
vbeln TYPE vbrp-vbeln,
END OF lt_vbrk.
SELECT vbeln
INTO TABLE lt_vbrk
FROM vbrk
WHERE vkorg = p_vkorg
AND vtweg = p_vtweg
AND spart = p_spart
AND fkdat IN s_fkdat
AND fkart <> c_fkart_zf5
AND bukrs = p_bukrs.
IF NOT lt_vbrk[] IS INITIAL.
SELECT vbrp~vbeln
vbrp~posnr
vbrk~fkart
vbrk~fkdat
vbrk~netwr
vbrk~waerk
vbrk~kunag
vbrk~bukrs
vbrk~xblnr
vbrp~matnr
vbrp~arktx
vbrp~fkimg
vbrp~vrkme
vbrp~ktgrm
likp~kunnr
lips~mtart
INTO CORRESPONDING FIELDS OF TABLE lt_int
FROM vbrp
INNER JOIN vbrk ON vbrk~vbeln = vbrp~vbeln
INNER JOIN vbfa ON vbfa~vbeln = vbrp~vbeln
AND vbfa~posnn = vbrp~posnr
INNER JOIN lips ON lips~vbeln = vbfa~vbelv
AND lips~posnr = vbfa~posnv
INNER JOIN likp ON likp~vbeln = lips~vbeln
FOR ALL entries IN lt_vbrk
WHERE vbrp~vbeln = lt_vbrk-vbeln
AND likp~kunnr IN s_kunnr
AND lips~mtart IN s_mtart.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Tue Aug 11, 2009 4:41 pm Post subject:
какая система , у нас 6.0 и стандартный индекс есть
тогда проверьте на чем больше в селекте время тратится например через se30 (думаю резуальта укажет на VBFA IMHO) _________________ Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Tue Aug 11, 2009 10:53 pm Post subject: Re: Оптимизация скорости селекта
stn wrote:
Здравствуйте!
Что можно с этим select сделать для увеличения скорости?
Code:
CONSTANTS: c_fkart_zf5 TYPE vbrk-fkart VALUE 'ZF5'.
SELECT vbrp~vbeln
vbrp~posnr
vbrk~fkart
vbrk~fkdat
vbrk~netwr
vbrk~waerk
vbrk~kunag
vbrk~bukrs
vbrk~xblnr
vbrp~matnr
vbrp~arktx
vbrp~fkimg
vbrp~vrkme
vbrp~ktgrm
likp~kunnr
lips~mtart
INTO CORRESPONDING FIELDS OF TABLE lt_int
FROM vbrp
INNER JOIN vbrk ON vbrk~vbeln = vbrp~vbeln
INNER JOIN vbfa ON vbfa~vbeln = vbrp~vbeln
AND vbfa~posnn = vbrp~posnr
INNER JOIN lips ON lips~vbeln = vbfa~vbelv
AND lips~posnr = vbfa~posnv
INNER JOIN likp ON likp~vbeln = lips~vbeln
WHERE vbrk~vkorg = p_vkorg
AND vbrk~vtweg = p_vtweg
AND vbrk~spart = p_spart
AND vbrk~fkdat IN s_fkdat
AND vbrk~fkart <> c_fkart_zf5
AND vbrk~bukrs = p_bukrs
AND likp~kunnr IN s_kunnr
AND lips~mtart IN s_mtart.
1.Если от LIKP и LIPS нужны только KUNNR(грузополучатель) и MTART (вид материала), то можно заменить эти таблицы на VBPA (PARVW = 'WE' - в случае, если на фактурах ведутся партнеры. У нас например настроено копирование партнерских ролей из вышестоящих документов) и MARA.
При этом отпадет надобность в таблице VBFA
2.Константу c_fkart_zf5 логичнее заменить на select-options - интерфейс БД хорошо заточен под работу с ними.
3.Можно оценить, сколько материалов выбирается по ограничению s_mtart:
а) если не очень много ( < 1000-2000), то может иметь смысл:
-сделать выборку по MARA, запихать номера материалов в RANGE и внутреннюю сортированную таблицу с MATNR и MTART
- исключить mtart из выборки
- добавить условие по vbrp~matnr с полученным RANGE
-после выборки в цикле проставить поле MTART из внутренней таблицы
б) если много, то оставить условие
4.Попробовать использовать вместо VBRK+VBRP ракурс WB2_V_VBRK_VBRP2 - иногда повышает быстродействие _________________ С уважением,
Удав.
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.