Текущее время: Вс, июл 27 2025, 22:30

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: оптимизация программы по времени
СообщениеДобавлено: Пт, ноя 02 2007, 14:24 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 25 2007, 07:31
Сообщения: 19
Всех с пятницей.
Такой вопрос. Программа в se38 делает многоуровневую выборку по двум таблицам. т.е. Сначала задаются данные, по которым делается выборка первого уровня, патом на основе полученных данных делается выборка ещё одна выборка... и т.д. Всего три или четыре уровня. Логика простая и надёжная, но вот незадача - программа зачастую работает минут 10-15 и иногда просто вываливается по таймауту как раз на стадии поиска и выборки необходимых данных :( что делать? как можно ускорить этот процесс... может быть есть какие то спациальные функции? если нужно, приатачу программу...

_________________
- Интересно это еще я или уже не я. - подумала Алиса. и стала грызть галюциногенный грибочек.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: оптимизация программы по времени
СообщениеДобавлено: Пт, ноя 02 2007, 14:32 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
ufo написал(а):
Всех с пятницей.
Такой вопрос. Программа в se38 делает многоуровневую выборку по двум таблицам. т.е. Сначала задаются данные, по которым делается выборка первого уровня, патом на основе полученных данных делается выборка ещё одна выборка... и т.д. Всего три или четыре уровня. Логика простая и надёжная, но вот незадача - программа зачастую работает минут 10-15 и иногда просто вываливается по таймауту как раз на стадии поиска и выборки необходимых данных :( что делать? как можно ускорить этот процесс... может быть есть какие то спациальные функции? ...

Специальных нет, есть стандартные - ликвидация вложенных циклов, по возможности буферизация таблиц с целью замены селектов на read/loop table, для "широких" таблиц замена select * на select нужные поля, организация параллельных выборок. Так-же следует произвести исследование БД на наличие нужных/лишних индексов.

_________________
"После" - не значит "вследствие"


Последний раз редактировалось sy-uname Пт, ноя 02 2007, 14:34, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 14:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Если есть возможность, то объедините уровни выборки в один select с помощью join. Запустите se30 и посмотрите, какие селекты выполняются дольше всего. Проверьте, чтобы все select'ы шли по индексам БД.

В целом подход творческий.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:01 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 25 2007, 07:31
Сообщения: 19
Цитата:
ликвидация вложенных циклов

к сожалению ликвидация не получица.

2 sy-uname: что вы имеете в виду под буферизацией таблиц? в первые об этом слышу.

Цитата:
Если есть возможность, то объедините уровни выборки в один select с помощью join


возможно я в начале неправильно выразился. в один объединить не получится. потому как:

Code:
SELECT mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
mara~bismt mara~normt makt~maktx stpo~menge stpo~ausch
  INTO TABLE all_cech1 FROM mast
    INNER JOIN stpo ON
      mast~stlnr EQ stpo~stlnr
    INNER JOIN mara ON
      stpo~idnrk EQ mara~matnr
    INNER JOIN makt ON
      stpo~idnrk EQ makt~matnr
        where mast~matnr in material
  GROUP BY mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
stpo~menge stpo~ausch mara~bismt mara~normt makt~maktx.

loop at all_cech1 into s_table_c1.
  if ( s_table_c1-komp NE ''
    and ( s_table_c1-komp LT 300000000000000000
    or s_table_c1-komp GE 400000000000000000 ) ).
*######################################################################*
SELECT mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
mara~bismt mara~normt makt~maktx stpo~menge stpo~ausch
  INTO TABLE all_cech2 FROM mast
    INNER JOIN stpo ON
      mast~stlnr EQ stpo~stlnr
    INNER JOIN mara ON
      stpo~idnrk EQ mara~matnr
    INNER JOIN makt ON
      stpo~idnrk EQ makt~matnr
        where mast~matnr EQ s_table_c1-komp
        and stpo~lkenz EQ ''
  GROUP BY mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
stpo~menge stpo~ausch mara~bismt mara~normt makt~maktx.

loop at all_cech2 into s_table_c2.
  if ( s_table_c2-komp NE ''
    and ( s_table_c2-komp LT 300000000000000000
    or s_table_c2-komp GE 400000000000000000 ) ).
*######################################################################*
SELECT mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
mara~bismt mara~normt makt~maktx stpo~menge stpo~ausch
  INTO TABLE all_cech3 FROM mast
    INNER JOIN stpo ON
      mast~stlnr EQ stpo~stlnr
    INNER JOIN mara ON
      stpo~idnrk EQ mara~matnr
    INNER JOIN makt ON
      stpo~idnrk EQ makt~matnr
        where mast~matnr EQ s_table_c2-komp
        and stpo~lkenz EQ ''
  GROUP BY mast~matnr mast~werks stpo~idnrk stpo~lgort stpo~lkenz
stpo~menge stpo~ausch mara~bismt mara~normt makt~maktx.

loop at all_cech3 into s_table_c3.
  if ( s_table_c3-komp NE ''
    and ( s_table_c3-komp LT 300000000000000000
    or s_table_c3-komp GE 400000000000000000 ) ).
      .
  else.
      temp = s_table_c3.
      insert temp into temp_all index 1.
  endif.
endloop.

*######################################################################*
  else.
      temp = s_table_c2.
      insert temp into temp_all index 1.
  endif.
endloop.

*######################################################################*
  else.
      temp = s_table_c1.
      insert temp into temp_all index 1.
  endif.
endloop.


далее производится сложение количеств всех одинаковых материалов с цифрой 3****** по специфической формуле...

задача по сути - вытащить все тройки на возможных четырёх уровнях. ниже четвёртого троек нет :) проверял неоднократно...

чаще всего программа затыкается на третем или четвёртом внутреннем цикле не справляясь с обьёмом данных. Проверял код на небольшого обьёма данных - отрабатывает на ура за секунды...

_________________
- Интересно это еще я или уже не я. - подумала Алиса. и стала грызть галюциногенный грибочек.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:17 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
ufo написал(а):
2 sy-uname: что вы имеете в виду под буферизацией таблиц? в первые об этом слышу.

Ну, например, заселектить сразу всю таблицу mast, а потом обрабатывать данные в циклах.


Последний раз редактировалось sibrin Пт, ноя 02 2007, 15:19, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:18 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Непаханное поля для оптимизации.

Закешируйте mara makt для начала во внутреннюю таблицу.

Code:
insert temp into temp_all index 1.

Стоит подумать о замене на Append.


Вообще faq немеряно
http://www.sapnet.ru/viewtopic.php?t=19


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:23 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
2ufo, как у вас все интересно :)
Все таки запустите SE30, погоняйте свою программу, смотрите что где тормозит, советы по оптимизации в той же транзакции внимательно почитайте... очень помогает, проверено

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Перед тем как оптимизировать собственно select'ы, нужно хотя бы в первом приближении выстроить логику обработки.

Т.е., как говорит vga, сначала сделать циклы по mast, а потом только выбирать тексты из makt, а не лепить join'ы в каждый select.

Для чего GROUP BY вообще не понятно.

А как вычисляется komp?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 15:51 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 25 2007, 07:31
Сообщения: 19
2 sibrin: komp соответствует stpo~idnrk.

во вторник попробую всё что написали, спасибо. всем удачных выходных.

PS > в таблице mast порядка 10000 записей... в stpo - 2 млн. посмотрим как оно всё переварит)

_________________
- Интересно это еще я или уже не я. - подумала Алиса. и стала грызть галюциногенный грибочек.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 02 2007, 19:33 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
vga написал(а):
Непаханное поля для оптимизации.

Закешируйте mara makt для начала во внутреннюю таблицу.

Code:
insert temp into temp_all index 1.

Стоит подумать о замене на Append.

+1
sibrin
+1

Насколько я понимаю - цель выбрать определенные конечные компоненты, использующиеся при изготовлении некоего продукта?
Может быть тогда лучше организовать такую процедуру:
1.Первоначальная выборка в таблицу 1.
2.Создаем копию таблицы 1 - таблицу 2.
3.Сортировка таблицы 2 по материалу
3.Выделение из выборки нужных материалов в таблицу 3.
4.Удаление из таблицы 2 данных, помещенных в таблицу 3.
5.Вторичная выборка по таблице 2 в таблицу 1.
6.Если таблица 1 не пустая, переходим к п.2.
7.Обрабатываешь таблицу 3 (добавляешь выборки по mara и makt) и вычисляешь то, что тебе нужно.

Суть в том, что спецификации имеют структуру дерева, а ты в цикле пытаешься идти не по уровням вложенности узлов дерева, а по каждой ветке до конца. :wink:

ЗЫ: Отсечь в STPO позиции с незаполненным полем IDNRK можно с помощью условия STPO~POSTP и таблицы T418

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 07:41 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 25 2007, 07:31
Сообщения: 19
Цитата:
Насколько я понимаю - цель выбрать определенные конечные компоненты, использующиеся при изготовлении некоего продукта?

ну да) вопрос только в том что мне не известно на каком уровне будут нужные мне компоненты... могут оказатьса и на первом, а могут...

спс. ща буду <я не знать русский языка> :)

_________________
- Интересно это еще я или уже не я. - подумала Алиса. и стала грызть галюциногенный грибочек.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 09:22 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1006
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
ufo написал(а):
(ну да) вопрос только в том что мне не известно на каком уровне будут нужные мне компоненты... могут оказатьса и на первом, а могут...
спс. ща буду <я не знать русский языка> :)

На вашем месте я бы использовал стандартную функциональность немного приаттачив под себя . Вот вам из последнего :D :
Code:
*&---------------------------------------------------------------------*
*& Form get_data_component
*&---------------------------------------------------------------------*
* Get the data based on Component level
*----------------------------------------------------------------------*
FORM get_data_component.

  DATA wa_lines TYPE i.

*-- Get the BOM item details

  SELECT stlty stlnr stlkn stpoz idnrk meins menge
  FROM stpo
  INTO TABLE t_stpo
  WHERE idnrk IN s_idnrk.

  IF sy-subrc = 0.

    CLEAR wa_lines.
    DESCRIBE TABLE t_stpo LINES wa_lines.

    IF wa_lines > 0.
      SELECT stlty stlnr stlal stkoz bmein bmeng
      FROM stko
      INTO TABLE t_stko
      FOR ALL ENTRIES IN t_stpo
      WHERE stlnr = t_stpo-stlnr.

      CLEAR wa_lines.
      DELETE ADJACENT DUPLICATES FROM t_stko COMPARING ALL FIELDS.
      DESCRIBE TABLE t_stko LINES wa_lines.

      IF wa_lines > 0.

*-- Get the BOM item details

        SELECT * FROM mast INTO TABLE t_mast FOR ALL ENTRIES IN t_stko
        WHERE werks = p_werks AND
        stlnr = t_stko-stlnr
        AND stlal IN s_stlal.

      ENDIF.

    ENDIF.

  ENDIF.

  LOOP AT t_mast.

    CLEAR : v_maktx.

* Get the material Description

    SELECT SINGLE maktx FROM makt INTO v_maktx
    WHERE matnr = t_mast-matnr
    AND spras = sy-langu.

* Get the material details from STKO Table

    SELECT SINGLE * FROM stko INTO wa_stko
    WHERE stlty = 'M'
    AND stlnr = t_mast-stlnr
    AND stlal = t_mast-stlal.

* Use the Function Module and get the format level by level

    PERFORM get_level_level.

    CLEAR : t_mast.
  ENDLOOP.

ENDFORM. " get_data_component

*&---------------------------------------------------------------------*
*& Form get_level_level
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_level_level.

  REFRESH : t_stb,
  t_matcat,
  alv_stb.

  CLEAR : t_stb,
  t_matcat,
  alv_stb.
  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      capid                 = 'PP01'
      datuv                 = sy-datum
      mktls                 = 'X'
      mehrs                 = 'X'
      mtnrv                 = t_mast-matnr
      stlal                 = '01'
      stlan                 = '1'
      stpst                 = 0
      svwvo                 = 'X'
      werks                 = p_werks
      vrsvo                 = 'X'
    TABLES
      stb                   = t_stb
      matcat                = t_matcat
    EXCEPTIONS
      alt_not_found         = 1
      call_invalid          = 2
      material_not_found    = 3
      missing_authorization = 4
      no_bom_found          = 5
      no_plant_data         = 6
      no_suitable_bom_found = 7
      conversion_error      = 8
      OTHERS                = 9.

  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM. " get_level_level


В качестве примера (для одного материала) можно посмотреть как работает транзакция CS12.
PS: Использование стандарта избавит вас от постоянного изменения программы, вследствии постоянно возникающих нюансиков о которых вы даже и не догадывались :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 12:33 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 25 2007, 07:31
Сообщения: 19
насчёт стандартов и др транзакций CS12/13 только что выяснилась одна забавная вещь, а именно - количество компонента, выдаваемое в качестве результата, у некоторых записей завышено в двое. :) с чем это связано даже не знаю. Так что я лучше код перепишу пару десятков раз нежели верить тому что писали в неизвестно каком состоянии бюргеры :) мб просто у нас такая забавная версия сапа :)

PS> из личных наблюдений: не так давно копаясь в коде CS13 увидел коментарий на немецком с кучей вопросов в конце :D :shock: знаю по себе, что подобные коменты ставит программист только в случае того что не знает как это работает :wink:

_________________
- Интересно это еще я или уже не я. - подумала Алиса. и стала грызть галюциногенный грибочек.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 13:45 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
ufo написал(а):
а именно - количество компонента, выдаваемое в качестве результата, у некоторых записей завышено в двое. :)


Всего лишь в двое? Чего-то мало, я бы больше насчитал, если таблицы связывать по неполному ключу
Code:
INTO TABLE all_cech1 FROM mast
    INNER JOIN stpo ON
   mast~stlnr EQ stpo~stlnr


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, ноя 06 2007, 14:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1006
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
ufo написал(а):
насчёт стандартов и др транзакций CS12/13 только что выяснилась одна забавная вещь, а именно - количество компонента, выдаваемое в качестве результата, у некоторых записей завышено в двое. :) с чем это связано даже не знаю. Так что я лучше код перепишу пару десятков раз нежели верить тому что писали в неизвестно каком состоянии бюргеры :) мб просто у нас такая забавная версия сапа :)

У меня к вам два вопроса:
1) А вы не учитываете, того что на некоторых уровнях спецификации компоненты могут повторятся?
2) Ну напишите вы свой отчет, а сверять данные с чем будете то?

PS: Интересная система отчетности у вас получится, стандартные отчеты( к примеру CS12) будут показывать одно, самописные другое. Останется толька один выход равнять :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB