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

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Всем доброго дня!
Собственно, сабж.
В зависимости от каких критериев нужно располагать таблицы в селекте?
По кол-ву ключевых полей в условии, по кол-ву полей в условии, по ожидаемому кол-ву выбранных записей, по общему кол-ву записей в таблице, и т.п.
Для упрощения возьмем ситуацию, когда все таблицы соединяются в INNER JOIN по ключевым полям, а в условии есть ограничения для каждой таблицы.


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
иногда оптимизатор самостоятельно определяет первичную таблицу,
вероятно без разницы


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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Т.е. оптимизировать SELECT с JOIN-ми вручную смысла не имеет, мы просто пишем таблицы в любом порядке, независимо от того, по каким ключам они связаны и по каким полям есть ограничения? Как-то подозрительно всё просто... Думал есть свобода для творчества, ведь если тот же самый запрос делать через несколько отдельных выборок, то их последовательность играет очень важную роль.


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
вероятно лучше писать в том порядке в каком
предполагается выборка, для читаемости.
оптимизатор сравнивает статистики подходящих индексов
и выбирает менее затратный путь.
такое происходит на oracle, для него же
можно указать хинт ordered чтобы в порядке запроса или
хинт первой таблицы leading( jointab1 ),
и в st05 убедиться, что работает.


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

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Присоединюсь к коллегам:
1. В случае oracle оптимизатор сам вибирает порядок джойна, но можно при помощи перечисленных troy хинтов этим управлять
2. По поводу ручного управления несколько эмпирических наблюдений.

Обычно, если в джойне существенное число таблиц, можно разделить их на три группы:
1. Очень большие таблицы, которые содержат основной объем данных и тормозят при выборке
2. Таблицы поменьше (всякие справочники значений)
а. Таблицы, которые никак не помогают фильтровать выборку из больших таблиц (типичный пример - названия к кодам, например названия заводов). Их, чтобы не путать оптимизатор Oracle лучше вообще убрать из селекта с join, выбрать отдельным селектом и дальше итоговую таблицу собирать в памяти при помощи loop + read table
б. Таблицы, которые оказывают влияние на выборку из больших таблиц. Вот тут надо сравнить, что обладает бОльшей селективностью: условия where к большой таблице или требование join с подмножеством маленькой и в зависимости от этого ставить на первое место либо большую таблицу, либо маленькую.

Как-то так, надеюсь не очень путанно объяснил.

_________________
Удача - результат нашего желания (© А. Нортон)


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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Спасибо за разъяснения. С одной стороны, хорошо - не придется сидеть корпеть над динамическим селектом ~100 строк (не думаю что я лучше чем Oracle сделаю), с другой стороны, быстрее его заставить работать уже не получится, это была последняя соломинка.


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

Зарегистрирован:
Ср, авг 07 2013, 22:18
Сообщения: 61
troy написал(а):
хорошо - не придется сидеть корпеть над динамическим селектом ~100 строк

Ммм... может стоит что-то упростить? Разбить селект на два, например. Создать индексы, чтобы выборка быстрее работала...
Испытываю горечь, когда приходится отлаживать чужие отчеты. Натыкаешься на большой селект - sy-subrc = 4. И все - следующие 30 минут выясняешь, в какой таблице, чего не хватает.


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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Programmer написал(а):
Ммм... может стоит что-то упростить? Разбить селект на два, например.

Там прелесть в том, что он динамический.
Code:
  SELECT (lv_columns_clause)
    FROM (lv_from_clause)
    INTO CORRESPONDING FIELDS OF TABLE lt_table[]
    FOR ALL ENTRIES IN lt_out[]
    WHERE (lt_where_clause).


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

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
ну а кол-во таблиц в from хотябы какой порядок имеет - 10, 100?
статистику никак не собрать по наиболее долгоиграющим из получающихся запросов? И тогда уж оптимизировать только под конкретное подмнжество из них.


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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Pavel Berezin написал:
ну а кол-во таблиц в from хотябы какой порядок имеет - 10, 100?
статистику никак не собрать по наиболее долгоиграющим из получающихся запросов? И тогда уж оптимизировать только под конкретное подмнжество из них.


Таблиц не много, зато некоторые по несколько раз под разными псевдонимами ))
Оптимизировано уже все что можно. Индексы все на месте, с обработкой данных тоже все нормуль.
Оставалась не тронутой только структура самого SELECTа, а ее оптимизировать, как обсудили выше, смысла нет.
Апгрейдить надо заказчика, чтобы не было таких "простыней".


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
как написал LKU,
если в join тяжёлые таблицы, то лучше разделить запрос на несколько,
это ускорит выполнение, несмотря на увеличение результатов отдельных выборок


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

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
troy написал(а):
Programmer написал(а):
Ммм... может стоит что-то упростить? Разбить селект на два, например.

Там прелесть в том, что он динамический.
Code:
  SELECT (lv_columns_clause)
    FROM (lv_from_clause)
    INTO CORRESPONDING FIELDS OF TABLE lt_table[]
    FOR ALL ENTRIES IN lt_out[]
    WHERE (lt_where_clause).

В данном случае ключевая проблема - FOR ALL ENTRIES. Любой JOIN будет лучше этого.
По поводу "прелестей" - "Сложно программисту - легко пользователю!". Мораль - программист не должен облегчать себе работу в ущерб качеству программы.

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


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

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Programmer написал(а):
...
Испытываю горечь, когда приходится отлаживать чужие отчеты. Натыкаешься на большой селект - sy-subrc = 4. И все - следующие 30 минут выясняешь, в какой таблице, чего не хватает.

И это правильно! Программы пишут не для того, чтобы программисту было легче, а для того, чтобы пользователю было легче.
Испытываю горечь, когда натыкаюсь на раздельные выборки во внутренние таблицы, а потом кучу гов#окода, в котором черт ногу сломит. Что особо печально, такие проги практически не оптимизируются. Еще печальней встречать в форуме вопросы типа "как получить сумму в Select". Представьте себя на операционном столе, а молодой хирург спрашивает коллег: "А кто-нибудь знает, как вырезать аппендикс?".
Проблема в том, что к SQL относятся как к простому ведру, типа "сначала начерпаю из колодца, потом разберусь". А это мощнейший язык, придуманный умнейшими людьми. Я бы к SAP вообще не подпускал людей без знания SQL. Пусть сначала "на трупах" поучатся.

p.s.
Извините, накипело.
Разумеется не всегда можно нормально использовать SQL, ибо кластерные таблицы. Но это уже вынужденные меры, а не принципиальная позиция.

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


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

Зарегистрирован:
Вт, апр 24 2007, 15:56
Сообщения: 1402
Parazit написал:
В данном случае ключевая проблема - FOR ALL ENTRIES. Любой JOIN будет лучше этого.

Да ну. Во-первых, FOR ALL ENTRIES зачастую лучше JOINов, если таблиц >2. Во-вторых, в некоторых случаях это единственный возможный вариант.
Parazit написал:
По поводу "прелестей" - "Сложно программисту - легко пользователю!". Мораль - программист не должен облегчать себе работу в ущерб качеству программы.

В целом согласен, но применительно к конкретному вопросу - не в тему. На работу пользователя способ реализации никак в моем случае не повлияет. Что касается облегчения работы - динамический селект как раз был сделан с целью улучшить качество кода (хотя качество - понятие относительное, конечно). А в части реализации он ну никак не проще отдельных выборок и подпрограмм.


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

Зарегистрирован:
Ср, авг 07 2013, 22:18
Сообщения: 61
Parazit написал:
И это правильно! Программы пишут не для того, чтобы программисту было легче, а для того, чтобы пользователю было легче. Испытываю горечь, когда натыкаюсь на раздельные выборки во внутренние таблицы, а потом кучу гов#окода, в котором черт ногу сломит.

Какому пользователю?
Вот перестал работать отчет. Консультант приходит, и начинает жаловаться, что запись не попадает в итоговую выборку. И говорит - "должна попадать". Кто будет разбирать чужой JOIN c 10 таблицами? А если данные программа читает порционно - достаточно 10 минут в отладке поймать sy-subrc = 4 и сообщить таблицу консультанту. Пусть уже сам разбирается, какого документа не хватает или почему бизнес-процесс пошел не так, как планировалось.
Разумеется, "куча гов#кода" - это уже другая крайность.


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

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


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

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


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

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