Posted: Wed Mar 12, 2008 10:11 am Post subject: Что лучше: FOR ALL ENTRIES или IN Select options
Доброе утро!
Возникла проблема с падением в дамп в 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 запросом?
Была еще вот такая тема - PACKAGE SIZE. Мне кажется, имеет смысл повторно пообсуждать...
John Doe, мне кажется это не совсем то. Через PACKAGE SIZE можно уменьшить размер возвращаемых данных, а в моем случае до получения данных дело не доходит. Падает в дамп при синтаксической обработке select. Конечно, я бы мог сделать замеры производительности, но падение в дамп в продуктиве, а в системе разработки такого большого объема данных не найти. Поэтому, чтобы личний раз не гонять до продуктива, решил спросить коллег, кто решал подобные задачи.
1 скорость можно поднять заменив SELECT * на выборку конкретного списка полей. Имхо чем меньше список полей тем больше проигрывает запрос FOR ALL ENTRIES. Точную информацию даст SE30.
Падает с сообщение: Runtime error SAPSQL_STMNT_TOO_LARGE
Нашел ноту 779374, в которой сказано:
"The ABAP runtime environment does not support large WHERE conditions (> 64 KB)"
Age: 170 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Wed Mar 12, 2008 1:27 pm Post subject:
К сожалению не помню название параметра, который указывает размер формируемого пакета для 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 меня подправит или дополнит )
Максимальный размер SELECT зависит от конкретной базы данных.
Oracle 6 - 8kb
Oracle 7 - 64kb
Зная значение этого параметра, можно подобрать оптимальное значение документов в ranges (естественно с запасом, потому что наверняка в запросы используются и другие ranges, которые могут быть тоже заполнены не одним значением)
Вообщем 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.
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.