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

PACKAGE SIZE



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



Joined: 11 Oct 2007
Posts: 103

PostPosted: Wed Dec 19, 2007 11:38 am    Post subject: PACKAGE SIZE Reply with quote

Привет!
Мне нужно обработать большое количество строк, порядка 30 миллионов.
Что предпочтительнее, использовать OPEN CURSOR или SELECT?

Code:
DATA: it TYPE TABLE OF mseg WITH HEADER LINE.

SELECT * FROM mseg INTO TABLE it
PACKAGE SIZE 1000
WHERE MJAHR = '2006'.
  LOOP  AT it.
    PERFORM proc_data TABLES it.
  ENDLOOP.
ENDSELECT.
Back to top
View user's profile Send private message
mike1
Модератор
Модератор



Joined: 22 Nov 2007
Posts: 82

PostPosted: Wed Dec 19, 2007 12:03 pm    Post subject: Reply with quote

Code:
    open cursor with hold .....
    do.
      fetch next cursor  ....
                                  package size ....
      if not sy-subrc is initial.
        close cursor ..
        exit.
      endif.
....
      call function 'DB_COMMIT'.
    enddo.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


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

PostPosted: Wed Dec 19, 2007 1:09 pm    Post subject: Reply with quote

Нарисовал такую программку:
Code:
DATA: ITAB TYPE TABLE OF HRP1001 WITH HEADER LINE,
      DBCUR TYPE CURSOR,
      BTIME TYPE SYSTTIMLO,
      RTIME TYPE SYSTTIMLO.

REFRESH ITAB.
GET TIME. BTIME = SY-TIMLO.
OPEN CURSOR DBCUR FOR SELECT * FROM HRP1001.
FETCH NEXT CURSOR DBCUR APPENDING TABLE ITAB.
CLOSE CURSOR DBCUR.
GET TIME. RTIME = SY-TIMLO - BTIME.
WRITE / 'OpenCursor'.
WRITE: 25 'Время выполнения' , RTIME.

REFRESH ITAB.
GET TIME. BTIME = SY-TIMLO.
SELECT * FROM HRP1001 CLIENT SPECIFIED INTO TABLE ITAB
  WHERE MANDT = SY-MANDT.
GET TIME. RTIME = SY-TIMLO - BTIME.
WRITE / 'Select *'.
WRITE: 25 'Время выполнения' , RTIME.

REFRESH ITAB.
GET TIME. BTIME = SY-TIMLO.
SELECT * FROM HRP1001 CLIENT SPECIFIED APPENDING TABLE ITAB
  PACKAGE SIZE 30000
  WHERE MANDT = SY-MANDT.
ENDSELECT.
GET TIME. RTIME = SY-TIMLO - BTIME.
WRITE / 'Select package size'.
WRITE: 25 'Время выполнения' , RTIME.


Перед запуском делают сброс буферов. В таблице БД 1250000 записей. Программа постоянно выдает разные результаты: то open cursor рулит, то селекты по-переменно...
mike1 объясните пожалуйста какие преимущества дает использование open cursor. Сам никогда эту технологию не использовал.

ЗЫ ну и за компанию вопрос - почему программа так безумствует...
Back to top
View user's profile Send private message Blog
mike1
Модератор
Модератор



Joined: 22 Nov 2007
Posts: 82

PostPosted: Wed Dec 19, 2007 1:48 pm    Post subject: Reply with quote

У меня схожая по масштабам бедствия проблема - копирование до сотни миллионов записей.
В приведенном мной коде два ключевых момента with hold и call function 'DB_COMMIT' Для select ... endselect и cursor без hold скорее всего не хватит откатных сегментов бд - периодически необходимо делать commit
Quote:
The following events close a cursor:
The CLOSE CURSOR statement.
The Open SQL statement COMMIT WORK

A database commit in Native SQL. In this case, a cursor opened with WITH HOLD is not closed.

Поэтому вместо COMMIT WORK call function 'DB_COMMIT'
ЗЫ а в консерватории что-то не в порядке или это ритейл?
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


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

PostPosted: Wed Dec 19, 2007 2:50 pm    Post subject: Reply with quote

mike1 wrote:
ЗЫ а в консерватории что-то не в порядке или это ритейл?

Если вопрос ко мне - то это документооборот, только в бАльшой конторе. Проблемы выборки не стоит - просто теоретические аспекты хотел уточнить, может когда использовать придется.
Back to top
View user's profile Send private message Blog
mike1
Модератор
Модератор



Joined: 22 Nov 2007
Posts: 82

PostPosted: Wed Dec 19, 2007 3:42 pm    Post subject: Reply with quote

в консерватории что-то не в порядке в первую очередь у меня,а потом у топикавтора. А злоупотребляя удержанием курсоров можно получить по шапке от базиса (У меня разовый случай ).
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Thu Dec 20, 2007 10:18 am    Post subject: Reply with quote

John Doe wrote:
ЗЫ ну и за компанию вопрос - почему программа так безумствует...
Надо полагать, нагрузка на сервер базы данных неравномерна.

До кучи:
Quote:
The following events close a cursor:
...
- The Open SQL statememnt ROLLBACK WORK
- A database rollback in Native SQL
- A screen change, in particular the statements CALL SCREEN, CALL DIALOG, CALL TRANSACTION, MESSAGE
- A Remote Function Call, in particular the statements CALL FUNCTION ... DESTINATION , CALL FUNCTION ... STARTING NEW TASK, or CALL FUNCTION ... IN BACKGROUND TASK.

If you attempt to open a cursor that has already been opened, you get a runtime error.
Back to top
View user's profile Send private message Blog Visit poster's website
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.