Текущее время: Вт, июл 29 2025, 22:06

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Оптимизация задачи ...., что можно накопать в сапе по этому поводу?
СообщениеДобавлено: Ср, июл 11 2007, 08:42 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
Всем привет! есть хто живой?
не все же в отпуске ... :)

Дело такое. я базабахал отчет баланс для налоговой.
спицифика у него мерзопакосная и пришлось делать цикл, около 100 итераций, в котором делаю два селекта к разным таблицам.
и в деве отчет работает 2-3 секунды, а в продуктиве 18-20 секунд.
я понимаю что не зя так делать, т.е. в цикле выполнять запросы.
ну так получилось.
вот у меня подозрения что при каждом цикле идет блокировка таблиц, и есть вопрос можно ли пред циклом блокировать таблицы, а после цикла "отпускать" их? может по быстрей будет.


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

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
Хе-хе, за 18-20 секунд - это летает на ракетном топливе :)
По поводу блокировки ничего не скажу, а по оптимизации:
1. Заточить селекты под индексы таблиц.
2. По возможности использовать один select * вместо кучи select single.


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

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Можно <я не знать русский языка> цикл на два разбить: в первом цикле сформировать RANGES для выборки из БД + процедурки -> выбрать из БД -> во второй цикл запихнуть оставшиеся процедурки обработки выбранной инфы.


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

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
Цитата:
1. Заточить селекты под индексы таблиц.
2. По возможности использовать один select * вместо кучи select single.


по поводу второго, ни в коем случае, нету у меня select single. у меня обычные селекты с динамическими полями и условиями в каждом цикле условия меняются. просто один селект к таблице FAGLFLEXT, а другой к таблице J_3RKKRS.

по поводу первого. т.е. у таблиц есть таблица индекстов ....
если честно я этого еще не делал ни разу ..., куда примерно тыкнутся чтобы посмотреть как заюзать индексы таблиц в сапе?


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

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
Salmaner написал:
по поводу второго, ни в коем случае, нету у меня select single. у меня обычные селекты с динамическими полями и условиями в каждом цикле условия меняются. просто один селект к таблице FAGLFLEXT, а другой к таблице J_3RKKRS.

по поводу первого. т.е. у таблиц есть таблица индекстов ....
если честно я этого еще не делал ни разу ..., куда примерно тыкнутся чтобы посмотреть как заюзать индексы таблиц в сапе?

2. В твоём случае - да, если без синглов, то не надо.
1. На примере MARD:
SE11 -> Утилиты -> Объект базы данных -> Просмотреть
Листаешь в самый конец, там видишь все индексы к этой таблице (если оные есть). У меня самый первый такой:
MANDT
MATNR
WERKS
LGORT
Далее строишь запрос, чтобы он попадал в этот индекс.
При запросе
SELECT * FROM MARD INTO TABLE ITAB CLIENT SPECIFIED WHERE
MANDT = SY-MANDT AND MATNR = XXX-MATNR AND WERKS = XXX-WERKS AND LGORT = XXX-LGORT.
скорость выборки будет максимальная. Если убрать из селекта хоть один критерий, то выборка будет уже не по индексу.


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

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
John Doe

дык не совсем понял ..., но я и так использую RANGES они у меня и меняются каждый цикл.
вот еслиб можно было сделать селект таблица(100 строк) (в которой поля, условия в RANGES) инту во внутреннюю(те же 100 строк) уже готовые итоги.


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

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Salmaner написал:
дык не совсем понял ..., но я и так использую RANGES они у меня и меняются каждый цикл.
вот еслиб можно было сделать селект таблица(100 строк) (в которой поля, условия в RANGES) инту во внутреннюю(те же 100 строк) уже готовые итоги.
Я говорил, что нужно вместо 100 селектов (по количеству итераций) нужно сделать один.
Создай отдельные рейнджи для обоих таблиц: FAGFLEXT и J_3RKKRS. В каждой итерации рейнджи не рефрешь, чтобы одним махом выбрать все.
После первого прогона цикла делаешь оба эти селекта во внутренние таблички типа ZFAGFLEXT и ZJ_3RKKRS. А потом, в следующем цикле читаешь уже из внутренних таблиц, а не из БД.


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

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
John Doe
спасиба конечно, но так ни чего не получится. я не правильно делают что говорю абстрактно.
и получается что мы говорим о разных вещах.
мне нетусмысла загонять все в рейнджи ... наверно.
если Вы не против, я бы стукнулся в асю.


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

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
Salmaner написал:
спасиба конечно, но так ни чего не получится. я не правильно делают что говорю абстрактно.
и получается что мы говорим о разных вещах.
мне нетусмысла загонять все в рейнджи ... наверно.

Ты лучше сюда выложи кусок кода - всем сообществом оптимизируем :)


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

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
баллин , кусок башой ...
по частам тока основное выложить


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 11 2007, 16:24 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
на одно поле по таблице J_3RKKRS четыре селекта из которых потом получим две суммы оборот по дебету и по кредету
Code:
perform  vnutree.     
loop. " в сто итераций
*вызов процедуры для заполнения рейнджса счтами.
...
      selectturn dt3xt.
      sum_oborot-sdx_dt = defsum.
      selectturn kt3xt.
      sum_oborot-sdx_kt = defsum * -1.
      selectturn dt4xt.
      sum_oborot-skx_kt = defsum.
      selectturn kt4xt.
      sum_oborot-skx_dt = defsum * -1.
endloop.
...


значения передаваемых условий

Code:
FORM vnutree.
  IF vnturn EQ 'X'.
    dt3xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space AND debet in r_schet AND kredit in r_schet'.
    kt3xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPK NE space AND kredit in r_schet AND debet in r_schet'.
    dt4xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space AND kredit in r_schet AND debet in r_schet'.
    kt4xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD NE space AND debet in r_schet AND kredit in r_schet'.
  ELSEIF vnturn NE 'X'.
    dt3xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space AND debet in r_schet AND kredit in ne_schet'.
    kt3xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPK NE space AND kredit in r_schet AND debet in ne_schet'.
    dt4xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space AND kredit in r_schet AND debet in ne_schet'.
    kt4xt = 'bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD NE space AND debet in r_schet AND kredit in ne_schet'.
  ENDIF.
ENDFORM.

тут r_schet и ne_schet масив со счетами как по одному так и с границами.

сам селект который все это добро получает
Code:
DEFINE selectturn.
  defsum = 0.
  select  sum( dmbtr ) into defsum from j_3rkkrs where (&1).
END-OF-DEFINITION.


Кстати пиплы караул, просто караул.
если в рейнджесе один счет то обороты у меня нормальные а если с границей то обороты я получаю не верные ... и куда копать я не знаю. просто кошмар.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 11 2007, 17:55 
Специалист
Специалист

Зарегистрирован:
Пт, апр 13 2007, 17:15
Сообщения: 225
Мдя. Вижу две проблемы:
1. Размер range, если слишком велики можно словить дамп на превышение размера select.
2. Если range бить на части, то есть вероятность, что не все варианты корреспонденции счетов будут учтены, а отсюда возможна кривая сумма.


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

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Я бы посоветовал вытащить сразу все по
Code:
bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space
во внутреннюю таблицу, а суммировать уже в цикле, читая таблицу по нужным счетам. Макрос в принципе может и не понадобится тогда.


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

Зарегистрирован:
Сб, янв 27 2007, 08:27
Сообщения: 337
Откуда: СНГ ... ЮГ
Пол: Мужской
<я не знать русский языка>, офис был закрыт, щас я дома.

Цитата:
Я бы посоветовал вытащить сразу все по Код:
bukrs = bukrs AND gjahr = year AND monat in r_monat AND XNEGPD EQ space

во внутреннюю таблицу, а суммировать уже в цикле, читая таблицу по нужным счетам. Макрос в принципе может и не понадобится тогда.


не, наверно
Code:
AND XNEGPD EQ space
надо будет отсюда убрать ибо суммы пляшут в связке набора счетов и этой фигни.
и там не тока равно пробелу. а дебет равно кредит + эта штучка и четыре вариации.
мама мия! и как я потом это все буду в цикле перебирать ... разве это намана .... ? получится башая таблица которая должна будет свернуться до количества строк шаблона xml ... или это так и должно быть?

EvgenySA
а если я заменю рейнджи на внутрение таблицы, где то видел в хелпе прям ручками строишь таблицу по содержанию полей рейнджа. может помочь?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 11 2007, 18:24 
Специалист
Специалист

Зарегистрирован:
Пт, апр 13 2007, 17:15
Сообщения: 225
Возможно я погорячился с выводами, смутила фраза про 100 шагов. Хотелось бы уточнить принцип построения range.

А заменить на внутреннюю таблицы и сделать FOR ALL ENTRIES можно, НО надо будет прописывать счета по принципу каждый с каждым.


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

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


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

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


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

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