Текущее время: Вс, июл 20 2025, 01:03

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Чт, ноя 07 2013, 19:09 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Пономарев Артем написал:
Удав, это был ответ на позицию Parazit'а, которую я до этой ноты разделял на 100% (FAE не может быть быстрее JOIN'а). В данный момент это уже не так :)
...

Артём, ты правда думаешь, что скачать миллион записей из БД во внутреннюю таблицу, потом сформировать миллион UNION-запросов (ура, наконец то по индексам), послать их серверу БД и получить наконец в результате одну запись - это эффективнее, чем тупой JOIN между двумя таблицами, по миллиону записей каждая, и получить ту же самую единственную запись?!
Для меня ничего не изменилось, только FAE будет работать быстрее, чем раньше. Как был JOIN предпочтительней, так и остался!

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 08:59 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
imho:
иногда использую join с for all entries по индексным полям - выполняется за разумное время.
но join по большим таблицам иногда неэффективен, напр если 2 большие таблицы
или отсутствуют индексы.
например по текущ проекту - тормозит по ключевым полям join на vbfa (46млн зап),
ibinvalues (176млн) на ibsymbol (262тыс), join с табл ausp (750млн).
возможно это связано с текущей нагрузкой на субд,
но иногда две отдельные выборки с FAE и манипуляциями на стороне abap as
быстрее чем join в разы, возможно в этих случаях быстрее вернуть 200тыс записей (10-20Мб данных)
и затем обработать их, чем производить операции над множествами на стороне субд.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 11:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
trop написал(а):
imho:
иногда использую join с for all entries по индексным полям - выполняется за разумное время.
но join по большим таблицам иногда неэффективен, напр если 2 большие таблицы
или отсутствуют индексы.
например по текущ проекту - тормозит по ключевым полям join на vbfa (46млн зап),
ibinvalues (176млн) на ibsymbol (262тыс), join с табл ausp (750млн).
возможно это связано с текущей нагрузкой на субд,
но иногда две отдельные выборки с FAE и манипуляциями на стороне abap as
быстрее чем join в разы, возможно в этих случаях быстрее вернуть 200тыс записей (10-20Мб данных)
и затем обработать их, чем производить операции над множествами на стороне субд.

Хотелось бы взглянуть на исходный код с JOIN и FAE, если не затруднит.

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 12:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
Code:
    select
      ibin~in_recno  " Номер записи
      ibin~instance  " КомпонентИнсталляции
      ibin~klart     " Вид класса

      ibinvalues~symbol_id     " ИдентификаторСимвола

*      ibsymbol~atinn     " Внутр. № признака
*      ibsymbol~atwrt     " Значение признака
*      ibsymbol~atflv     " Со значения
*      ibsymbol~atflb     " По значение
*      ibsymbol~atcod     " Границы интервала

      from ibin
      inner join ibinvalues
         on ibinvalues~in_recno eq ibin~in_recno    " Номер записи
**        and ibinvalues~in_segmcnt eq ~                " СегмСчетчик для значений/доменов
*      inner join ibsymbol
*         on ibsymbol~symbol_id eq ibinvalues~symbol_id " ИдентификаторСимвола

      into table ibin_j
      for all entries in data_t
      where ibin~instance       eq data_t-cuobj
*        and ibsymbol~atinn      in atinn_r      "++
      .

(в data_t[] находится 1 строка)
если восстановить ibsymbol, то работает медленнее в несколько раз,
чем если добирать ibsymbol (см ниже)

Code:
    select
      ibsymbol~symbol_id     " ИдентификаторСимвола
      ibsymbol~atinn     " Внутр. № признака
      ibsymbol~atwrt     " Значение признака
      ibsymbol~atflv     " Со значения
      ibsymbol~atflb     " По значение
      ibsymbol~atcod     " Границы интервала
      from ibsymbol
      into table ibsymbol_i
      for all entries in ibsymbol_i
      where ibsymbol~symbol_id  eq ibsymbol_i-symbol_id    " ИдентификаторСимвола
        and ibsymbol~atinn      in atinn_r
      .


Последний раз редактировалось trop Сб, ноя 09 2013, 10:46, всего редактировалось 3 раз(а).

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 12:45 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Parazit написал:
Артём, ты правда думаешь, что ... - это эффективнее?

В некоторых случаях да.
Я уже привел классический пример: использование условия OR для поля индекса отбрасывается оптимизатором с высокой долей вероятности. И вместо INDEX UNIQUE SCAN мы получим INDEX RANGE SCAN со всеми вытекающими.

Когда:
1. Записей в таблицах много
2. В результате запроса выбирается относительно небольшое их кол-во
3. В запросе используется условие OR для поля(ей) индекса
с высокой долей вероятности UNION ALL окажется быстрее JOIN'а несмотря на все оверхеды.

Такие дела :)

З.Ы.: trop, а планы можно посмотреть? Сами то запросы - тлен.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 15:25 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
trop написал(а):
Code:
    select
...
*      inner join ibsymbol
*         on ibsymbol~symbol_id eq ibinvalues~symbol_id " ИдентификаторСимвола

(в data_t[] находится 1 строка)
если восстановить ibsymbol, то работает медленнее в несколько раз,
чем если добирать ibsymbol (см ниже)

Code:
    select
...
      from ibsymbol
...
      where ibsymbol~symbol_id  eq ibsymbol_i-symbol_id    " ИдентификаторСимвола
        and ibsymbol~atinn      in atinn_r
      .

Жаль, потестить не на чем...
Однако условия не равны, во втором случае добавлено ограничение ibsymbol~atinn in atinn_r.

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 15:51 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Пономарев Артем написал:
Parazit написал:
Артём, ты правда думаешь, что ... - это эффективнее?

В некоторых случаях да.
Я уже привел классический пример: использование условия OR для поля индекса отбрасывается оптимизатором с высокой долей вероятности. И вместо INDEX UNIQUE SCAN мы получим INDEX RANGE SCAN со всеми вытекающими.

Когда:
1. Записей в таблицах много
2. В результате запроса выбирается относительно небольшое их кол-во
3. В запросе используется условие OR для поля(ей) индекса
с высокой долей вероятности UNION ALL окажется быстрее JOIN'а несмотря на все оверхеды.

...

Для сравнения двух вариантов "пересечения двух множеств данных" нужно рассматривать чистый эксперимент, т.е. различаться должны только способы получения пересечения (JOIN и FAE), остальные условия должны быть равными.
Я тоже заметил, что в новом подходе FAE не будет строить неоптимизируемый "OR"-запрос (никаких других OR не рассматриваем), а значит использует индекс. При прочих равных JOIN тоже его использует, а значит в этом у FAE преимущества нет. Зато у FAE есть затраты: на передачу большого количества данных (п.1) на сервер приложений во внутреннюю таблицу, формирование и передачу в БД большого количества запросов, интерпретацию этих запросов сервером БД и их выполнение, и наконец передача результата (п.2) серверу приложений. У JOIN затраты только на небольшой запрос и выдачу небольшого результата.
При условии, что оба варианта используют одни и те же индексы, за счет чего FAE может быть эффективнее?

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 16:08 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Вот смотри: нужно ограничить выборку набором значений поля, входящего в ключ. Как это будет записано с использованием DML выражения JOIN и в какой результирующий запрос к СУБД будет преобразовано?

З.Ы.: Дело не в использовании индекса как такового. А в том, что UNIQUE SCAN быстрее RANGE SCAN'а (UNION - это SET оператор, в отличие от условий (OR, GT, LT и далее по списку)). И при определенных вводных эта разница может вылиться в преимущество в общем времени выполнения FAE над JOIN (преимущество, при этом, может быть очень значительное).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 19:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Пономарев Артем написал:
Как это будет записано с использованием DML выражения JOIN и в какой результирующий запрос к СУБД будет преобразовано?


Эээээ.. а с каких это пор JOIN стал относиться к DML?

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Пт, ноя 08 2013, 21:23 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Кодер, ну ок. Я опустил полную формулировку. Оператор раздела FROM DML оператора SELECT (и еще парочки, тоже DML ;)). Так более правильно.

З.Ы.: Кто скажет, что JOIN не относится к DML - пусть первый бросит в себя камень :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Сб, ноя 09 2013, 10:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
Parazit написал:
...
Жаль, потестить не на чем...
Однако условия не равны, во втором случае добавлено ограничение ibsymbol~atinn in atinn_r.


atinn_r присутствует и в первом запросе тоже, упустил когда копировал


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация последовательности таблиц в JOIN
СообщениеДобавлено: Сб, ноя 09 2013, 23:13 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, сен 30 2011, 11:47
Сообщения: 62
Пол: Мужской
интересная тема. Надо будет потестировать FOR ALL ENTRIES и обычный способ, который я часто использую - объявление RANGE, забивания туда допустимого количества значений и выполнения одного SQL запроса с IN (в случае с простыми ключами, конечно).
Допустимое - это исходя из размера запроса и длины поля, чтобы СУБД могла схавать. (П.с. приходится Join не использовать, т.к. я в BW обычно получаю некий набор уже в виде внутренней таблицы).


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

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


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

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


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

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