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

Часовой пояс: 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 часа


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

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


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

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