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

Тормозит селект по MSEG



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



Joined: 06 Feb 2008
Posts: 37

PostPosted: Wed Nov 05, 2008 12:10 pm    Post subject: Тормозит селект по MSEG Reply with quote

Здравствуйте. Очень долго работет селект. Можно его оптимизировать?

Code:

  DATA: BEGIN OF table_temp OCCURS 0,
            mblnr LIKE mseg-mblnr,
            budat LIKE mkpf-budat,
            charg LIKE mseg-charg,
            is_return LIKE mseg-smbln,
        END OF table_temp.

      SELECT mk~budat m1~mblnr
             m1~charg m2~mblnr AS is_return
        INTO CORRESPONDING FIELDS OF TABLE table_temp
        FROM mseg AS m1
             INNER JOIN mkpf AS mk ON mk~mblnr = m1~mblnr AND
                                  mk~mjahr = m1~mjahr
             LEFT JOIN mseg AS m2 ON
                               ( m2~smbln = m1~mblnr AND
                                 m2~sjahr = m1~mjahr AND
                                 m2~smblp = m1~zeile AND
                                 m2~bwart = '102' )
        WHERE ( m1~ebeln = t_data-ebeln AND
                m1~ebelp = t_data-ebelp AND
                m1~bwart IN ('101', '103', '105') ).
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


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

PostPosted: Wed Nov 05, 2008 1:23 pm    Post subject: Reply with quote

Читайте здесь советы от Удава
Back to top
View user's profile Send private message Blog
vga
Мастер
Мастер


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

PostPosted: Wed Nov 05, 2008 1:41 pm    Post subject: Reply with quote

Если в вашей системе существует индекс MSEG~S по полям smbln, sjahr, smblp, то торможение связано с использованием OUTER JOIN, для выполнения которого почти всегда (а может и всегда ) создается tmp таблица в базе.

Имхо, в данном случае, его лучше заменить набором селектов по полному ключу.
Code:
DATA: BEGIN OF table_temp OCCURS 0,
          mblnr LIKE mseg-mblnr,
          mjahr LIKE mseg-mjahr,
          zeile LIKE mseg-zeile,
          budat LIKE mkpf-budat,
          charg LIKE mseg-charg,
          is_return LIKE mseg-smbln,
      END OF table_temp.
FIELD-SYMBOLS: <table_temp> LIKE table_temp.


SELECT m1~mblnr m1~mjahr m1~zeile mk~budat m1~charg
INTO CORRESPONDING FIELDS OF TABLE table_temp
FROM mseg AS m1
INNER JOIN mkpf AS mk ON mk~mblnr = m1~mblnr
                     AND mk~mjahr = m1~mjahr
WHERE m1~ebeln = t_data-ebeln
  AND m1~ebelp = t_data-ebelp
  AND m1~bwart IN ('101', '103', '105')
.

LOOP AT table_temp ASSIGNING <table_temp>.
  SELECT SINGLE mblnr
  INTO <table_temp>-is_return
  FROM mseg
  WHERE smbln = <table_temp>-mblnr
    AND sjahr = <table_temp>-mjahr
    AND smblp = <table_temp>-zeile
    AND bwart = '102'.
ENDLOOP.
Back to top
View user's profile Send private message Blog Visit poster's website
Удав
Гуру
Гуру


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

PostPosted: Wed Nov 05, 2008 8:51 pm    Post subject: Re: Тормозит селект по MSEG Reply with quote

corsair wrote:
Здравствуйте. Очень долго работет селект. Можно его оптимизировать?

Code:

  DATA: BEGIN OF table_temp OCCURS 0,
            mblnr LIKE mseg-mblnr,
            budat LIKE mkpf-budat,
            charg LIKE mseg-charg,
            is_return LIKE mseg-smbln,
        END OF table_temp.

      SELECT mk~budat m1~mblnr
             m1~charg m2~mblnr AS is_return
        INTO CORRESPONDING FIELDS OF TABLE table_temp
        FROM mseg AS m1
             INNER JOIN mkpf AS mk ON mk~mblnr = m1~mblnr AND
                                  mk~mjahr = m1~mjahr
             LEFT JOIN mseg AS m2 ON
                               ( m2~smbln = m1~mblnr AND
                                 m2~sjahr = m1~mjahr AND
                                 m2~smblp = m1~zeile AND
                                 m2~bwart = '102' )
        WHERE ( m1~ebeln = t_data-ebeln AND
                m1~ebelp = t_data-ebelp AND
                m1~bwart IN ('101', '103', '105') ).

Если выборка идет по заказам, вместо MSEG лучше использовать таблицу EKBE - там есть как данные mkpf, так и данные mseg (не все конечно, но для выборки данных достаточно).
А про сторно написал vga. Wink
Единственно, что loop .. select ... можно заменить на select ...for all entries, будет небольшое повышение производительности за счет уменьшения количества обращений к БД.

_________________
С уважением,
Удав.
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.