Текущее время: Пн, июл 28 2025, 02:41

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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