Текущее время: Чт, июл 31 2025, 09:10

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Господа!
Чисто для проверки сделал две программы
первая:
data: tab_1 like ... occurs ... with header line.
data: tab_2 like ... occurs ... with header line.

select * from ... into table tab_1.
select * from ... into table tab_2.

loop at tab_1.
loop at tab_2 where field1 = tab_1-field_1 and
field2 = tab_1-field_2.
endloop.
endloop.

и вторая:
data: tab_1 like ... occurs ... with header line.
DATA: tab_2 LIKE SORTED TABLE OF ...
WITH NON-UNIQUE KEY field_1 field_2
WITH HEADER LINE.

select * from ... into table tab_1.
select * from ... into table tab_2.

loop at tab_1.
loop at tab_2 where field1 = tab_1-field_1 and
field2 = tab_1-field_2.
endloop.
endloop.

В итоге получилось что второй вариант работает медленне чем первый. почему так?


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

Зарегистрирован:
Пн, сен 06 2004, 11:43
Сообщения: 1551
Пол: Мужской
_gary_ написал(а):
В итоге получилось что второй вариант работает медленне чем первый. почему так?
_gary_ написал(а):
..................SORTED TABLE OF ...
WITH NON-UNIQUE KEY field_1 field_2
WITH HEADER LINE..................

_________________
Ex ipso fonte bibere
Цитата:
Abyssus abyssum invocat
Dies diem docet
Ducunt volentem fata, nolentem trahunt

Estote prudentes sicut serpentes


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 10 2007, 15:07 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Не понял. А какой смысл этого ответа?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Loop
СообщениеДобавлено: Пн, сен 10 2007, 15:11 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
_gary_ написал(а):
Господа!
Чисто для проверки сделал две программы
первая:
...
В итоге получилось что второй вариант работает медленне чем первый. почему так?

Сколько это в граммах\секундх и какой объём данных - потеря произвотительности может быть, например, на построении индекса.

И я сейчас не помню - использует-ли LOOP индекс для доступа - посмотрите в расширенной проверке - нет ли ругани на данный LOOP/

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 10 2007, 15:23 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Расширеная проверка програмы все выдала по нулям.
В tab_1 около 53121 записей.
В tab_2 около 10189 записей.
первый вариант выполняется примерно за 134 секунды
второй переваливает за 230.

Да и вообще как-то немного даже нелогично чтобы LOOP не смотрел ключевые поля.

неужто везде придется править на read и потом while?


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

Зарегистрирован:
Чт, окт 26 2006, 15:07
Сообщения: 227
Быть может, тратится время, чтобы сделать таблицу tab_2 во второй программе сортированной. Посмотрите на время выполнения программ, убрав из них loop


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

Зарегистрирован:
Вт, авг 21 2007, 16:46
Сообщения: 43
Откуда: Москва
насколько помню loop where всегда дает полный обход внутренней таблицы. Лучше внутри внешнего цикла использовать read table.

_________________
все может быть, что может быть; и лишь того лишь быть не может - что может быть не может быть - все остальное может быть...


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

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
darth написал(а):
насколько помню loop where всегда дает полный обход внутренней таблицы. Лучше внутри внешнего цикла использовать read table.


F1 (на LOOP) напоминает:
When you use the WHERE condition with a STANDARD or HASHED table, a full table scan is always required.
If you are working with a SORTED TABLE, the partial sequential processing can be optimized so that only the entries that actually satisfy the WHERE condition are processed. This optimization requires that the WHERE condition be specified in the form

WHERE k1 = v1 AND k2 = v2 AND ... AND kn = vn

where the components k1, ..., kn are in the same sequence as the beginning of the table key.

_________________
Счастье есть!


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

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
matel написал(а):
Быть может, тратится время, чтобы сделать таблицу tab_2 во второй программе сортированной. Посмотрите на время выполнения программ, убрав из них loop


_gary_, или, лучше, оформите выборку и циклы через perform, а потом сообщите время, полученное на них в динамическом анализе.

_________________
Счастье есть!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 10 2007, 16:58 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Ну в принципе вот что получилось
время по первому циклу занимает 208 001 531 мкс
второй цикл вызывается 53 121 раза и занимает в сумме
207 868 879 мкс


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 10 2007, 17:40 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 26 2006, 15:07
Сообщения: 227
Что и требовалось доказать


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

Зарегистрирован:
Пн, сен 06 2004, 11:43
Сообщения: 1551
Пол: Мужской
_gary_ написал(а):
Не понял. А какой смысл этого ответа?
Смысл этого ответа в том, что второй вариант у тебя, теоритически, откушивает время на сортировку таблицы tab_2. Замерь времена селектов. Я не знаю на сколько у тебя индекс таблицы репозитария из которой делается селект соотноится с индексом внутренней таблицы. Но после того как данные переданы от сервера БД к аппликейшену - происходит еще упорядочивание записей во внутренней таблице, раз уж она у тебя индексированная.....

_________________
Ex ipso fonte bibere
Цитата:
Abyssus abyssum invocat
Dies diem docet
Ducunt volentem fata, nolentem trahunt

Estote prudentes sicut serpentes


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Еще неплохо посмотреть реальные значения field1 и field2 во второй таблице. Например, если большинство значений стремится к field1 = '00000002' и field2 = '0001', то и выигрыша в производительности не будет.


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

Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1006
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
Всегда делаю так и не трачю время на эксперименты:
Code:
More sophisticated loop: parallel cursors
ВремВып: 739 микросек.
* Entries: 100 (ITAB1), 1000 (ITAB2)
* Line width: 100
* Both tables sorted by key K

I = 1.
LOOP AT ITAB1 INTO WA1.
  LOOP AT ITAB2 INTO WA2 FROM I.
    IF WA2-K <> WA1-K.
      I = SY-TABIX.
      EXIT.
    ENDIF.
    " ...
  ENDLOOP.
ENDLOOP.

По производительности можно сравнить со следующей конструкцией:
Code:
Straightforward nested loop
ВремВып: 33 457 микросек.
* Entries: 100 (ITAB1), 1000 (ITAB2)
* Line width: 100
* Both tables sorted by key K

LOOP AT ITAB1 INTO WA1.
  LOOP AT ITAB2 INTO WA2
                WHERE K = WA1-K.
    " ...
  ENDLOOP.
ENDLOOP.

-------------------------------------------------
У ABAPERA всегда есть время на подвиг :D


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

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
ROKO написал:
Всегда делаю так и не трачю время на эксперименты:
...


Неужели постоянно возникают задачи, в которых эта экономия настолько существенна??

Может вообще стоит подобные циклы в виде внешних call`ов на сервере приложений реализовывать? ;)

Это мне напоминает ситуацию "экономии на спичках" в циклах, когда предлагается их разворачивать. Может быть и здорово, но программа получается ужасной:

Code:
Original Code                   Optimized Code
for(i=0; i<n; i++)              for(i=0; i<n-(n%3); i+=3)
a[i] = c[i] ;                     {
                                       a[i] = c[i] ;
                                       a[i+1] = c[i+1];
                                       a[i+2] = c[i+2];
                                     }
                                   for(i;i < n; i++)
                                     a[i] = c[i];


P.S. А ещё можно динамически генерировать код для обработки определённых таблиц в зависимости от математической модели распределения ключей в таблице.

_________________
Счастье есть!


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

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


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

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


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

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