Текущее время: Сб, июл 19 2025, 17:10

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 12:19 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, авг 24 2007, 11:29
Сообщения: 350
Удав написал(а):
Обращения к БД по ST05 к этим таблицам не было.
Если еще сделать буферизацию на уровне программы, то за счет уменьшения количества чтений время будет намного меньше.


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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 12:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Code:
DATA: gt_t499s TYPE SORTED TABLE OF t499s WITH UNIQUE KEY werks stand. "Глобальная буферная таблица для справочника t499s

...
FORM get_t499s USING p_data type <строка основной таблицы>.
  DATA: ls_t499s type t499s.

  CLEAR ls_t499s.
  READ TABLE gt499s INTO ls_t499s WITH KEY werks = p_data-werks
                                                                    stand = p_data-stand.
  IF sy-subrc <> 0. "Если записи нет в буфере
    ls_t499s-werks = p_data-werks.
    ls_t499s-stand = p_data-stand.
    SELECT SINGLE ktext
    INTO ls_t499s-ktext
    FROM t499s
    WHERE werks = ls_t499-werks
      AND stand = ls_t499s-stand.

    INSERT ls_t499s INTO TABLE gt_t499s. "Добавляем в любом случае, даже если запись в t499s не найдена
  ENDIF.
  MOVE-CORRESPONDING ls_t499s TO p_data.
ENDFORM.

...
"Основной цикл
  LOOP AT gt_data ASSIGNING <fs_data>.
...
    PERFORM get_t499s USING <fs_data>.
...
  ENDLOOP.


В результате выборка значений с помощью SELECT будет выполняться столько раз, сколько встретится уникальная комбинация WERKS и STAND.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 13:18 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 07 2009, 10:23
Сообщения: 51
Пол: Мужской
Удав написал(а):
В результате выборка значений с помощью SELECT будет выполняться столько раз, сколько встретится уникальная комбинация WERKS и STAND.


а чем такой вариант лучше чем предварительная выборка из t499s всех нужных значений одним селектом с for all entries из gt_data по нужным параметрам?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 13:24 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, авг 28 2006, 11:24
Сообщения: 292
Пол: Мужской
Удав написал(а):
Code:
DATA: gt_t499s TYPE SORTED TABLE OF t499s WITH UNIQUE KEY werks stand. "Глобальная буферная таблица для справочника t499s



Если использовать hashed table, будет быстрее.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 13:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Удав написал(а):
А кто сказал, что будет 5000 чтений из БД для справочников?

Ну, если в range кладут 5000 EQ, то можно предположить, что и выборка будет того же порядка.
Впрочем ты прав, это только мое предположение. Тут может пролить свет только автор! :)

Удав написал(а):
Для буферизированных таблиц данные будут браться с сервера приложений и запроса к БД не будет,

Прежде чем взять, пусть и с сервера приложений, запрос сначала надо интепретировать. А интерпретация, да еще в цикле - всегда долго.

Удав написал(а):
для небуферизированных таблиц можно организовать буферизацию на уровне программы.
При этом количество select single будет равно количеству уникальных значений в справочниках. :wink:

А вот это уже другое дело. Если один раз считать небольшие таблицы во внутренние и читать по ключам, тогда ого-го... Это мы с тобой уже проходили. :)
Но есть один недостаток, ухудшается читабельность и модификабельность программы.

Удав написал(а):
А вот соединение через left join больше, чем 3-5 таблиц может занять у интерпретатора запросов Oracle большее время, чем интерпретация большого количества простых запросов.

Это все таки зависит от количество записей выборки. Думаю, при 5000 всё таки JOIN быстрее будет.
К тому же slim ранее уже подтвердил это:
slim написал(а):
Предыдущая версия этой программы так и работала, как вы предлагаете, но она генерирует очень большое количество запросов к БД из-за этого сервер БД начинает тормозить...


И потом, наверно это вопрос предпочтений. Я, например, больше доверяю ORACLE при работе с БД, а вот САПу нет! :)

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 15:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
slim написал(а):
Как сделать буферизацию на уровне программы, и вообще что она из себя вообще представляет?


Удав привел хороший пример, можешь попробовать.
Только, в данном конкретном случае, с выборкой по вспомогательным таблицам и в JOINе нет проблем - всё четко по ключам. Разница, если и будет, то не принципиальная. Основная проблема заключается в сложных условиях выборки по таблицам ANLA и ANLZ из-за кучи RANGE, как я понимаю, весьма не пустых. Ради интереса можно попробовать убрать все JOIN, оставить только ANLA и ANLZ, и потестить на производительность.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Ср, июл 01 2009, 16:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Parazit написал:
Удав написал(а):
Для буферизированных таблиц данные будут браться с сервера приложений и запроса к БД не будет,

Прежде чем взять, пусть и с сервера приложений, запрос сначала надо интепретировать. А интерпретация, да еще в цикле - всегда долго.

Я же привел тайминги :)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Чт, июл 02 2009, 09:52 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Удав написал(а):
Я же привел тайминги :)


Сферические и в вакууме :)

Моя точка зрения сильно ближе к точки зрения Parazit'а.
Oracle я доверяю больше. И у него тоже есть буфер.

Join вида
Code:
FROM vbak
JOIN vbuk
ON vbak~vbeln  EQ vbuk~vbeln
JOIN vbap
ON vbak~vbeln  EQ vbap~vbeln
JOIN t001w
ON vbap~werks  EQ t001w~werks
JOIN t001k
ON t001w~bwkey EQ t001k~bwkey
JOIN t001
ON t001k~bukrs EQ t001~bukrs
JOIN vbup
ON vbap~vbeln  EQ vbup~vbeln     AND
vbap~posnr  EQ vbup~posnr
JOIN vbep
ON vbap~vbeln  EQ vbep~vbeln     AND
vbap~posnr  EQ vbep~posnr

с агрегатами - 381 935.

Будем железом мериться? ;)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ограничение на кол-во записей в ranges
СообщениеДобавлено: Чт, июл 02 2009, 11:14 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, авг 24 2007, 11:29
Сообщения: 350
Сравнил 2 кода первый работает около 16 сек, а второй около 7 минут, при том условии что в табличке out_tab более 40000 записей
Форма GET_VZOBJECT буферизация таблички VZOBJECT(В самой таблице установлено "Буферизация запрещена") сделана так как предложил Удав
Первый код
Code:
    REFRESH IT_VZOBJECT.
    LOOP AT OUT_TAB INTO O_TAB.
      CLEAR IT_VZOBJECT.
      IT_VZOBJECT-ADROBJNR = O_TAB-INTRENO.
      PERFORM GET_VZOBJECT USING IT_VZOBJECT.
      APPEND IT_VZOBJECT.
    ENDLOOP.


Второй код
Code:
SELECT A~ADRNR A~ADROBJNR INTO CORRESPONDING FIELDS OF TABLE IT_VZOBJECT FROM VZOBJECT AS A FOR ALL ENTRIES IN OUT_TAB
      WHERE A~ADROBJNR = OUT_TAB-INTRENO.


Думаю, что
В первую очередь: надо пользоваться JOIN.
Во вторую очередь:
1. Если таблица БД буферизована, то FOR ALL ENTRIES IN
2. Если таблица БД НЕ буферизована, то программной ее буферизацией и SELECT SINGLE


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

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


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

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


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

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