Текущее время: Пн, июл 21 2025, 00:26

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


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

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


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

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