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

Оптимизация скорости селекта



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Tue Aug 11, 2009 9:36 am    Post subject: Оптимизация скорости селекта Reply with quote

Здравствуйте!
Что можно с этим 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.
Back to top
View user's profile Send private message
RA
Участник
Участник



Joined: 03 Dec 2007
Posts: 13

PostPosted: Tue Aug 11, 2009 11:43 am    Post subject: Re: Оптимизация скорости селекта Reply with quote

stn wrote:
Здравствуйте!
Что можно с этим select сделать для увеличения скорости?


А план запроса можно?

У Вас нет ограничений в WHERE для vbrp

Может создать индекс для vbrk по WHERE и к нему JOIN ить остальные таблицы?

Code:
SELECT ...
  FROM vbrk AS k
  INNER JOIN vbrp AS p ON k~vbeln = p~vbeln
  ...
Back to top
View user's profile Send private message
Fami4
Специалист
Специалист


Age: 43
Joined: 04 Aug 2009
Posts: 62
Location: UA

PostPosted: Tue Aug 11, 2009 11:52 am    Post subject: Reply with quote

stn, вы ведь подымали вопрос по поводу join,может сделать как тут говорят:

http://www.sapnet.ru/viewtopic.php?t=2728
Back to top
View user's profile Send private message
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Tue Aug 11, 2009 12:47 pm    Post subject: Re: Оптимизация скорости селекта Reply with quote

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
  ...


Создание индекса конечно решит проблему, но для одного отчета создавать индекс для часто используемой таблицы с инвойсами... не хотца. Sad

Fami4 wrote:

stn, вы ведь подымали вопрос по поводу join,может сделать как тут говорят:


Ну там же о другом речь, хотя таблицы пересекаются.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Tue Aug 11, 2009 12:58 pm    Post subject: Reply with quote

Без индексов по 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.

  ENDIF.
Back to top
View user's profile Send private message Blog Visit poster's website
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Tue Aug 11, 2009 4:02 pm    Post subject: Reply with quote

у вас индекс для VBFA активен по VBELN и POSNR ?
_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Back to top
View user's profile Send private message Send e-mail Blog
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Tue Aug 11, 2009 4:38 pm    Post subject: Reply with quote

ghost wrote:
у вас индекс для VBFA активен по VBELN и POSNR ?


Активен пользовательский индекс
VBELN
VBELV
POSNV

стандартных нет.
Back to top
View user's profile Send private message
ghost
Специалист
Специалист


Age: 37
Joined: 18 Jan 2008
Posts: 71
Location: Tashkent-Astana-Moscow

PostPosted: Tue Aug 11, 2009 4:41 pm    Post subject: Reply with quote

какая система , у нас 6.0 и стандартный индекс есть
тогда проверьте на чем больше в селекте время тратится например через se30 (думаю резуальта укажет на VBFA IMHO)

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Back to top
View user's profile Send private message Send e-mail Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Tue Aug 11, 2009 10:53 pm    Post subject: Re: Оптимизация скорости селекта Reply with quote

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 - иногда повышает быстродействие Wink

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Wed Aug 12, 2009 9:10 am    Post subject: Reply with quote

vga wrote:
Чисто теоретически, так не будет быстрее?
До Q не догонял, но в D примерно так же по скорости.

Спасибо всем за ответы, особенно Удав за развернутый. Буду экперементировать.
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.