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

Что лучше: FOR ALL ENTRIES или IN Select options



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Максим
Специалист
Специалист



Joined: 27 Sep 2007
Posts: 61

PostPosted: Wed Mar 12, 2008 10:11 am    Post subject: Что лучше: FOR ALL ENTRIES или IN Select options Reply with quote

Доброе утро!
Возникла проблема с падением в дамп в select из-за большого размера сформированного SELECT.
В ranges содержится больше 10 тыс номеров документов.
Поэтому возник вопрос, что эффективней по скорости, использовать
FOR ALL ENTRIES

Code:
TABLES: lips.
RANGES: r_vbeln FOR lips-vbeln.
DATA: it_lips TYPE TABLE OF lips.
DATA: BEGIN OF it_vbeln OCCURS 0,
        vbeln TYPE  lips-vbeln,
      END OF   it_vbeln.

SELECT * FROM lips INTO TABLE it_lips
  FOR ALL ENTRIES IN it_vbeln
  WHERE vbeln = it_vbeln-vbeln.


или последовательно заполнять ranges неким количеством документов, например 100, и добавлять в итоговую таблицу?

Code:
TABLES: lips.
RANGES: r_vbeln FOR lips-vbeln.
DATA: it_lips TYPE TABLE OF lips.
DATA: BEGIN OF it_vbeln OCCURS 0,
        vbeln TYPE  lips-vbeln,
      END OF   it_vbeln.

* цикл с заполнением 100 номеров документов
SELECT * FROM lips APPENDING TABLE it_lips
WHERE vbeln IN r_vbeln.
* конец цикла


2) Какая максимальная длина строки, передавааемая в базу с select запросом?
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


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

PostPosted: Wed Mar 12, 2008 10:38 am    Post subject: Reply with quote

Была еще вот такая тема - PACKAGE SIZE. Мне кажется, имеет смысл повторно пообсуждать...
Back to top
View user's profile Send private message Blog
Максим
Специалист
Специалист



Joined: 27 Sep 2007
Posts: 61

PostPosted: Wed Mar 12, 2008 10:53 am    Post subject: Reply with quote

John Doe wrote:
Была еще вот такая тема - PACKAGE SIZE. Мне кажется, имеет смысл повторно пообсуждать...


John Doe, мне кажется это не совсем то. Через PACKAGE SIZE можно уменьшить размер возвращаемых данных, а в моем случае до получения данных дело не доходит. Падает в дамп при синтаксической обработке select. Конечно, я бы мог сделать замеры производительности, но падение в дамп в продуктиве, а в системе разработки такого большого объема данных не найти. Поэтому, чтобы личний раз не гонять до продуктива, решил спросить коллег, кто решал подобные задачи.
Back to top
View user's profile Send private message
mike1
Модератор
Модератор



Joined: 22 Nov 2007
Posts: 82

PostPosted: Wed Mar 12, 2008 11:16 am    Post subject: Reply with quote

1 скорость можно поднять заменив SELECT * на выборку конкретного списка полей. Имхо чем меньше список полей тем больше проигрывает запрос FOR ALL ENTRIES. Точную информацию даст SE30.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


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

PostPosted: Wed Mar 12, 2008 12:38 pm    Post subject: Reply with quote

Максим wrote:
Падает в дамп при синтаксической обработке select.
Падает по тайм-ауту или из-за нехватки памяти?
Если по тайм-ауту - то должно помочь:
Code:
DATA: ITAB TYPE TABLE OF BSAS,
      NUMLINE TYPE P,
      _% TYPE I,
      ST_TIME TYPE T, EX_TIME TYPE T,
      STRING TYPE STRING.

SELECT COUNT( * ) FROM BSAS.
CHECK SY-SUBRC IS INITIAL.
NUMLINE = SY-DBCNT.
ST_TIME = SY-TIMLO.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
          PERCENTAGE = 1
          TEXT       = 'Чтение данных'.
SELECT * FROM BSAS APPENDING TABLE ITAB
  PACKAGE SIZE 30000.
  _% = SY-DBCNT / NUMLINE * 100.
  MOVE SY-DBCNT TO STRING.
  CONCATENATE 'Выбрано записей:' STRING INTO STRING SEPARATED BY SPACE.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
       EXPORTING
            PERCENTAGE = _%
            TEXT       = STRING.
ENDSELECT.

GET TIME.
EX_TIME = SY-TIMLO - ST_TIME.
DESCRIBE TABLE ITAB LINES NUMLINE.

WRITE: 'Выбрано записей', NUMLINE.
WRITE: / 'Время выполнения', EX_TIME.


ЗЫ Схожая тема на сапфоруме - Проблема оптимизации
Back to top
View user's profile Send private message Blog
Максим
Специалист
Специалист



Joined: 27 Sep 2007
Posts: 61

PostPosted: Wed Mar 12, 2008 12:57 pm    Post subject: Reply with quote

John Doe wrote:
Падает по тайм-ауту или из-за нехватки памяти?


Падает с сообщение: Runtime error SAPSQL_STMNT_TOO_LARGE
Нашел ноту 779374, в которой сказано:
"The ABAP runtime environment does not support large WHERE conditions (> 64 KB)"
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Wed Mar 12, 2008 1:27 pm    Post subject: Reply with quote

К сожалению не помню название параметра, который указывает размер формируемого пакета для FOR ALL ENTRIES,
(Mike1 писал про него на форуме), но смысл такой, запрос с использованием FOR ALL ENTRIES разбивается на много мелких запросов к базе в зависимости от количества записей в таблице, указанной для FOR ALL ENTRIES.

В вашем примере, выбираются данные с использованием первичного ключа, поэтому сам по себе запрос будет выполняться быстро.
Поэтому большой разницы в использовании FOR ALL ENTRIES или IN ranges быть не должно.
Другое дело, если запрос будет использовать неполный ключ или вообще не будет использовать индексы. В этом случае для выполнения запроса база данных будет использовать частичное или полное сканирование индексов или таблиц, а в ряде случаев строить tmp таблицы для его выполняения (например при использовании GROUP BY, ORDER BY, ...).
Понятно, что в этом случае, на выполнение каждого единичного запроса будет затрачено существенное время. Чем будет меньше единичных запросов к базе, тем суммарное время выполнения будет резко различаться.
Поэтому лучше использовать IN ranges, в котором можно указать от 100 до 1000 номеров документов, чем использовать FOR ALL ENTRIES, который будет формировать запрос, использующий ~5 документов (зависит от параметра, на который ссылался выше. Надеюсь Mike1 меня подправит или дополнит Smile )

Максимальный размер SELECT зависит от конкретной базы данных.
Oracle 6 - 8kb
Oracle 7 - 64kb
Зная значение этого параметра, можно подобрать оптимальное значение документов в ranges (естественно с запасом, потому что наверняка в запросы используются и другие ranges, которые могут быть тоже заполнены не одним значением)
Back to top
View user's profile Send private message Blog Visit poster's website
Максим
Специалист
Специалист



Joined: 27 Sep 2007
Posts: 61

PostPosted: Thu Mar 13, 2008 6:30 pm    Post subject: Reply with quote

Вообщем FOR ALL ENTRIES стал сильно тормозить, пошел то такому пути.

Code:
TABLES: lips.
RANGES: r_vbeln FOR lips-vbeln.
DATA: it_lips TYPE TABLE OF lips.
DATA: BEGIN OF it_vbeln OCCURS 0,
        vbeln TYPE  lips-vbeln,
      END OF   it_vbeln.

DATA: l_max_line TYPE I,
      l_mod      TYPE I,
      l_tabix    TYPE sy-tabix.
CONSTANTS:
      c_max_size TYPE I VALUE 1000.

* Таблица с номерами документов
  DESCRIBE TABLE lt_tab LINES l_max_line.

  REFRESH r_vbeln.
  r_vbeln-sign   = 'I'.
  r_vbeln-option = 'EQ'.
* Цикл по таблице с номерами документов
  LOOP AT lt_tab.
    l_tabix = sy-tabix.

* заполняем промежуточный range
    r_vbeln-low = lt_tab-vbeln.
    APPEND lr_vbeln.
    l_mod = l_tabix MOD c_max_size.
    IF l_mod EQ 0 OR l_tabix EQ l_max_line.

* Селект в реальности другой
      SELECT * FROM lips APPENDING TABLE it_lips
        WHERE vbeln IN r_vbeln.

      REFRESH r_vbeln.

    ENDIF.
  ENDLOOP.


Всем спасибо!
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.