Текущее время: Вт, июл 29 2025, 11:30

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 10:46 
Начинающий
Начинающий

Зарегистрирован:
Вт, дек 20 2011, 18:42
Сообщения: 20
Можно ли как то оптимизировать запрос:

SELECT b027~lifnr
nach~parnr
ekko~ebeln
ekko~aedat
ekko~ernam
nast~erdat
nast~eruhr
nast~vstat
nast~datvr
nast~uhrvr
v_usr_name~name_text AS ernam_text
lfa1~name1
INTO CORRESPONDING FIELDS OF TABLE gt_record
FROM ekko
JOIN b027 ON b027~lifnr = ekko~lifnr
JOIN nast ON nast~objky = ekko~ebeln
JOIN nach ON nach~knumh = b027~knumh
JOIN v_usr_name ON v_usr_name~bname = ekko~ernam
JOIN lfa1 ON lfa1~lifnr = b027~lifnr
WHERE b027~lifnr IN s_lifnr
AND nast~erdat IN s_erdat
AND ekko~ebeln IN s_ebeln
AND nast~vstat IN r_vstat
AND nast~kschl = 'ZEDI'
AND ekko~ernam IN s_ernam
AND (
nast~vstat = '1'
OR nast~vstat = '0' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1') )
OR nast~vstat = '2' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1', '0') )
)
AND EXISTS ( SELECT * FROM ekpo WHERE ekpo~ebeln = ekko~ebeln AND ekpo~werks IN s_werks ).


В частности смущают две строки "NOT EXISTS ( SELECT * FROM nast" Отработает ли запрос быстрее и с тем же результатом если вместо "*" вставить "vstat" ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 12:28 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 02:02
Сообщения: 188
Откуда: Мирный -> Москва
Пол: Мужской
Это ужас какой-то...
nast + ekko+ ekpo (через EXIST) и еще куча таблиц....

раздербанивать надо на части....


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 13:27 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, апр 17 2006, 21:49
Сообщения: 299
Откуда: Москва
Слишком сложно, на мой взгляд. Я бы разбил на выборки попроще.
Не забываем, что при джойне выборка не учитывает буфер.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 13:49 
Специалист
Специалист

Зарегистрирован:
Чт, ноя 23 2006, 17:37
Сообщения: 197
Откуда: Москва
Пол: Мужской
Первое, что видится, это разные подходы к формированию подмножества ограничений на поле NAST-VSTAT. Далее, подзапрос к EKPO можно приJOIN'ить к запросу к EKKO. Кроме того, сомневаюсь, что поле NAST-OBJKY однозначно соответствует EKKO-EBELN, Если не ошибаюсь, NAST-OBJKY длиннее, т.е., кмк, лучше сделать так:
Code:
DATA: lv_objky type nast-objky.

lv_objky = ekko-ebeln.

select ... from nast
where objky = lv_objky...

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


Последний раз редактировалось Paul_80 Чт, ноя 15 2012, 14:08, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 14:00 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Жесть. Особенно EXIST'ы. Переписать все заново, а не оптимизировать.

Как минимум:
Code:
AND EXISTS ( SELECT * FROM ekpo WHERE ekpo~ebeln = ekko~ebeln AND ekpo~werks IN s_werks ).

заменить на JOIN.

Code:
AND (
nast~vstat = '1'
OR nast~vstat = '0' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1') )
OR nast~vstat = '2' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1', '0') )
)

Это мракобесие заменить на выборку всех записей из nast по ключу и анализ на стороне сервера приложений.


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

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Уточните, какие select-options обязательны для заполнения?
А так, запрос вполне имеет право на существование. Нужно только добавить мандант в условие join, ограничение kappl в nast, и проконтролировать план запроса, чтобы он был оптимальным. Но это зависит от обязательных условий выбора. Например, если обязательный только завод, то это очень печально.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 15:10 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
wild83 написал(а):
Отработает ли запрос быстрее и с тем же результатом если вместо "*" вставить "vstat" ?

Нет, * в EXISTS не влияет на производительность.
Переписывание EXISTS на JOIN скорее всего тоже ничего не даст, также как и разбиение на несколько запросов.
Можно попробовать заменить
Code:
b027~lifnr IN s_lifnr

на
Code:
EKKO~lifnr IN s_lifnr


nast~vstat можно добавить в список выборки и убрать из where, с обработкой на абапе после селекта


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 15:46 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Цитата:
Переписывание EXISTS на JOIN скорее всего тоже ничего не даст

Скорее всего да, но возможны варианты. Коротенько здесь. Дальше по ссылкам.
EXISTS, обычно, подталкивает оптимизатор к использованию nested loops. Что не всегда оптимально.

Цитата:
nast~vstat можно добавить в список выборки и убрать из where, с обработкой на абапе после селекта

Вот мне кажется это первое и основное, что необходимо сделать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 15:53 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Цитата:
nast~vstat можно добавить в список выборки и убрать из where, с обработкой на абапе после селекта

Вот мне кажется это первое и основное, что необходимо сделать.[/quote]


А зачем получать в ABAP то, что не нужно? Так ведь можно и вообще условие where убрать, а потом в абапе отфильтровать ;)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 15:57 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
__Gennady, в крайности впадать, конечно, не стоит. Но я бы с удовольствием посмотрел на план запроса и косты с таким условием:
Code:
AND (
nast~vstat = '1'
OR nast~vstat = '0' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1') )
OR nast~vstat = '2' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1', '0') )
)

Есь сильное подозрение что это будет весьма забавное зрелище :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Чт, ноя 15 2012, 16:25 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Пономарев Артем написал:
__Gennady, в крайности впадать, конечно, не стоит. Но я бы с удовольствием посмотрел на план запроса и косты с таким условием:
Code:
AND (
nast~vstat = '1'
OR nast~vstat = '0' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1') )
OR nast~vstat = '2' AND NOT EXISTS ( SELECT * FROM nast WHERE objky = ekko~ebeln AND vstat IN ('1', '0') )
)

Есь сильное подозрение что это будет весьма забавное зрелище :)


А в чем проблема? Заказ же укзан. KAPPL+KSCHL можно еще, а так - ничего ужасного.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Пт, ноя 16 2012, 00:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
wild83 написал(а):
Можно ли как то оптимизировать запрос:
...
В частности смущают две строки "NOT EXISTS ( SELECT * FROM nast" Отработает ли запрос быстрее и с тем же результатом если вместо "*" вставить "vstat" ?

В общем то нормальный селект, переносить в абап - самое последнее дело, на то и SQL, чтобы данными ворочать. Если долго выполняется запрос, через st05 анализируете конкретный случай и думаете над индексами, только без фанатизму. В основном всё зависит от конкретных условий select-options.

По поводу 2-х строк, можно их сократить за счет настроечной таблички, где определить предпочтения, типа ZTPRTY_VSTAT:
Code:
PRIORITY VSTAT
    A       1
    B       0
    C       2

тогда подзапрос можно примерно такой (за точность синтаксиса не ручаюсь, но смысл понятен):
Code:
and nast~vstat in
( SELECT nast~VSTAT
      FROM nast
      JOIN ZTPRTY_VSTAT on ZTPRTY_VSTAT~VSTAT = nast~VSTAT
      WHERE objky = ekko~ebeln
        and ZTPRTY_VSTAT~priority = min( ZTPRTY_VSTAT~priority ) ...

Если бы предпочтения шли в порядке 0 1 2, то и таблички бы не нужно было.

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


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

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

Мне вот интересно, кто-нибудь в принципе подумал как будет происходить обработка такого условия СУБД? Что на каждую запись из полученного набора (а тут со 100% гарантией nested loops), VSTAT у которой не 1, будет фулл-скан NAST'а?

Оно зависит, конечно, от данных, статистики, индесков и прочего, что есть в системе автора вопроса. Но шансы на такой план выполнения, который я предположил - весьма высоки.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация запроса
СообщениеДобавлено: Пт, ноя 16 2012, 15:42 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Пономарев Артем написал:
Parazit, если автор спрашивает как оптимизировать запрос - логично предположить что он уже работает с неудовлетворяющим автора временем выполнения.

Мне вот интересно, кто-нибудь в принципе подумал как будет происходить обработка такого условия СУБД? Что на каждую запись из полученного набора (а тут со 100% гарантией nested loops), VSTAT у которой не 1, будет фулл-скан NAST'а?

Оно зависит, конечно, от данных, статистики, индесков и прочего, что есть в системе автора вопроса. Но шансы на такой план выполнения, который я предположил - весьма высоки.


Откуда возникнет fullscan? Nested loop да, но это нормалный план запроса.


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

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
__Gennady, осмелюсь предложить взглянуть на первичный ключ и вторичные индексы таблицы NAST. Что, по вашему, должен подумать оптимизатор относительно использования индексов, когда его просят выбрать записи по OBJKY и VSTAT? Я понимаю что это зависит от конкретной ситуации, но в 99,9% тут может быть всего два варианта:
1. FULLSCAN
2. INDEX SKIP SCAN + TABLE ACCESS BY INDEX ROWID
Оба плана, прямо скажем, не быстрые.

Вариант что у автора добавлен индекс опускаем, т.к. не было бы вопроса. Индекс вполне себе решение, кстати. Но я бы, конкретно в этом случае, выкидывал лишние записи на стороне сервера приложений.


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

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


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

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


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

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