Текущее время: Вс, авг 03 2025, 23:26

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: План запроса
СообщениеДобавлено: Пн, сен 22 2008, 15:24 
Менеджер
Менеджер

Зарегистрирован:
Вт, дек 06 2005, 17:52
Сообщения: 559
Прошу помощи. Подскажите, как будет выстроен план запроса в каждом случае и какой вариант предпочтительнее с точки зрения производительности.

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

Итак, исходный запрос, взят просто для примера. Меня-то интересесует в общем - куда лучше ставить условия для таблиц, участвующих в inner join?

SELECT
...
FROM fmioi AS f
INNER JOIN eban AS e ON
e~banfn = f~refbn
AND e~bnfpo = f~rfpos
WHERE
...

Теперь нужно добавить условие AND e~pstyp = '1'. Как будет лучше и какая, собственно, будет разница в плане построения запроса?

1а)
SELECT
...
FROM fmioi AS f
INNER JOIN eban AS e ON
e~banfn = f~refbn
AND e~bnfpo = f~rfpos
AND e~pstyp = '1'
WHERE
...

или
1б)
SELECT
...
FROM fmioi AS f
INNER JOIN eban AS e ON
e~banfn = f~refbn
AND e~bnfpo = f~rfpos
WHERE
...
AND e~pstyp = '1'

А теперь - еще вариант - нужно ограничить условие AND e~pstyp IN pstyp_sel. Поскольку вставить такое условие в INNER JOIN не разрешено, получаем два варианта:

2а)
SELECT
...
FROM fmioi AS f
INNER JOIN eban AS e ON
e~banfn = f~refbn
AND e~bnfpo = f~rfpos
WHERE
...
AND e~pstyp IN pstyp_sel

2б)
SELECT
...
FROM fmioi AS f
INNER JOIN eban AS e ON
e~banfn = f~refbn
AND e~bnfpo = f~rfpos
WHERE
...

Делаем выборку без условия, а затем неподходящие значения удаляем уже из результатов выборки.
DELETE itab_result where pstyp NOT IN pstyp_sel

Какой вариант лучше для каждого случая? Понятно, что это зависит еще и от условией where, количества записей в таблицах и т.п., но меня интересует именно общий (теоретический) случай.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 22 2008, 16:10 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Если данных сильно меньше - оптимизатор с высокой долей вероятности не заморачиваясь выберет FULL TABLE SCAN и все ваши вопросы не будут иметь никакого значения.
В остальных случаях - общетеоретического ответа нет. Вы сам правильно сказали: "что это зависит еще и от условией where, количества записей в таблицах и т.п.".
Как ответ прочитайте в интернетах о следующих ключевых словах:
селективность (индекса)
FULL TABLE SCAN
UNIQUE INDEX SCAN
RANGE INDEX SCAN
NESTED LOOPS
MERGE JOIN
HASH JOIN

Тогда читать план запроса и понимать его станет значительно легче. Впрочем я уже где-то в этой ветке писал о тех. стороне. Можете поискать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 29 2008, 19:48 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
В соответствии с Help, варианты 1а и 1б в результате не будут отличаться:

Цитата:
The comparisons in the condition <cond> can appear in the WHERE clause instead of the ON clause, since both clauses are applied equally to the temporary table containing all of the lines resulting from the join. However, each join must contain at least one comparison in the condition <cond>.

http://help.sap.com/saphelp_nw04/helpda ... ontent.htm

Во второй части вопроса вариант 2a скорее всего лучше. В общем случае рекомендуется отбрасывать ненужные записи на уровне SELECT, а не тащить лишнее в память, чтобы потом удалять.

_________________
"One of the symptoms of an approaching nervous breakdown is the belief that one's work is terribly important." Bertrand Russell


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

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


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

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


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

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