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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 14:22 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Привет. А как может быть такое?

Дамп из ST05, имеем хинт INDEX( "MSEG" "MSEG~Z6" ) но INDEX RANGE SCAN MSEG~Z5

Code:
SQL Statement
SELECT
/*+
  INDEX( "MSEG" "MSEG~Z6" )
*/
  T_00."BWART", T_00."MATNR"
FROM
  "MSEG" T_00 INNER JOIN "MKPF" T_01 ON T_01."MANDT"=:A0 AND T_00."MBLNR"=T_01."MBLNR" AND T_00."MJA
  HR"=T_01."MJAHR"
WHERE
  T_00."MANDT"=:A1 AND T_01."BUDAT">=:A2 AND T_00."MJAHR"=:A3 AND T_00."BWART"=:A4 AND T_00."WERKS"=
  :A5 AND T_00."MBLNR">=:A6 AND T_00."MBLNR"<=:A7


Execution Plan

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SELECT STATEMENT ( Estimated Costs = 12 , Estimated #Rows = 4 )
  |
  ---   6 FILTER
      |   Filter Predicates
      |
      ---   5 NESTED LOOPS
          |
          |--   3 NESTED LOOPS
          |   |   ( Estim. Costs = 12 , Estim. #Rows = 4 )
          |   |   Estim. CPU-Costs = 96.227 Estim. IO-Costs = 12
          |   |
          |   |-----1 INDEX RANGE SCAN MSEG~Z5
          |   |       ( Estim. Costs = 4 , Estim. #Rows = 4 )
          |   |       Search Columns: 5
          |   |       Estim. CPU-Costs = 30.086 Estim. IO-Costs = 4
          |   |       Access Predicates
          |   ------2 INDEX UNIQUE SCAN MKPF~0
          |           ( Estim. Costs = 1 , Estim. #Rows = 1 )
          |           Search Columns: 3
          |           Estim. CPU-Costs = 9.074 Estim. IO-Costs = 1
          |           Access Predicates Filter Predicates
          |
          ------4 TABLE ACCESS BY INDEX ROWID MKPF
                  ( Estim. Costs = 2 , Estim. #Rows = 1 )
                  Estim. CPU-Costs = 16.535 Estim. IO-Costs = 2
                  Filter Predicates

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 14:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
а какие поля в индексах z5, z6 ?
и ещё запрос в виде opensql

скорее всего из-за >=, <=


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 15:05 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Во всех индексах Z3...Z7 одинаковый набор полей, но порядок полей разный. Пытаюсь понять, какой порядок лучше работает, это не очевидно.

А, да, важное. Когда я в ST05 ставлю Explain with hint, и ставлю hint на Full Scan, оно тоже не работает.

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 16:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Покажите абап-код. Там был прикол, что нужно указывать не имя таблы, а имя алиаса из джойна. Причем именно то имя алиаса, которое показывается в st05(T_00, T_01)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 16:36 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
раз не приводите open sql, считаем ,что хинт написан правильно.
для индекса вероятно лучше указывать наиболее узкий критерий последним (листьевой ключ),
с точки зрения экономии, с другой стороный если есть достаточно узкий критерий, то можно
создать индекс только с этим полем (mandt + критерий).
наверное это настраивается - оптимизатор иногда выбирает из 2х индексов
наиболее подходящий по статистике, игнорируя хинт -
from A inner join B,
в условиях A указан хинт, но оптимизатор выбирает B как первичную таблицу,
вероятно из-за того, что в ней меньше записей, или в B есть более привлекательный индекс чем хинт A


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 18:59 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Прошу прощения, я тут работал :-)

Вот код, точнее не тот самый - но этот же чуть чуть поправленый (заменились условия на ренджи)

Алиасов нет

Индекс создаётся по полям

MSEG: MANDT MJAHR BWART WERKS MBLNR MATNR
MKPF: BUDAT MBLNR MJAHR

Если индекс подхватывается, всё работает очень быстро. Если нет, умирает на долго.

Цитата:
SELECT WERKS MATNR
FROM MSEG
JOIN MKPF
ON MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR
INTO TABLE it_matnrwerks PACKAGE SIZE i_packagesize
WHERE
MKPF~BUDAT IN SO_DATE AND
MSEG~MJAHR = il_mblnr-MJAHR AND
MSEG~BWART = '251' AND
MSEG~WERKS IN SO_WERKS AND
MSEG~MBLNR >= il_mblnr-MBLNR_MIN AND
MSEG~MBLNR <= il_mblnr-MBLNR_MAX
ORDER BY MATNR WERKS
%_HINTS ORACLE 'INDEX("MSEG" "MSEG~Z6")'.


В принципе, сейчас проблема только что если в код добавить ещё один JOIN с MARA, то он умирает. Приходится реализовывать JOIN по внутренней таблице.

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 20:41 
Почетный гуру
Почетный гуру
Аватара пользователя

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

кому понадобились такие странные данные ..
для такого запроса, можно проверить есть ли индексы -
mkpf (mandt, budat) и mseg (mandt,bwart,werks),
поле matnr в условиях не используется, а поиск индекса ведётся по
заполненным критериям из where.
order by можно не добавлять в запрос, это немного замедляет выборку,
можно по результату сделать sort и delete adjacent duplicates.

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Чт, окт 17 2013, 22:48 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 16:47
Сообщения: 85
вставлю свои пять копеек.
Я бы потратил время на соответствие порядка выбираемых данных порядку в таблицах...
и в условиях - порядку в индексах (ключах)
а потом план еще разик посмотреть без хинта.

возможно вперед поставить ту таблицу которая дает меньшее множество?

Ваши ренджи не "должны" иметь like`s - всё так?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Пт, окт 18 2013, 08:29 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
А еще пересоберите статистику на всякий случай

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Пт, окт 18 2013, 09:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
2 Yanvladimirovich: все правильно, у Вас алиасы - не указаны. А вот DBI сап, когда из openSQL конвертит джойн в SQL понятный субд накручивает алиас сам(причем на ваши алиасы ему будет плеать), см. вашу трассу в st05.
Поэтому в вашем случае нужно указывать вот так
Цитата:
%_HINTS ORACLE 'INDEX("T_00" "T_00~Z6")'.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Пт, окт 18 2013, 10:56 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Поправил, даже версия %_HINTS ORACLE 'INDEX("T_00" "MSEG~Z6")'. работает.

А алисасы точно всегда прописываются в порядке того, как таблица идёт в запросе?

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Пт, окт 18 2013, 11:01 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
2 Yanvladimirovich: нету у меня ответа на этот вопрос. Это надо авторов DBI спрашивать. Но я на всякий пожарный воткнул еще один хинт ORDERED чтоли (сейчас системы под рукой нет посмотреть), он говорит оре, что надо брать таблы в той последовательности, как они перечислены в запросе.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INDEX HINT not working
СообщениеДобавлено: Пт, окт 18 2013, 19:05 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
жутковатый какойто запрос (и индексы похоже такиеже :D).

А что в нём не устраивает - стоимость вроде невелика?
И кстати, значения переменных какие (план надеюсь реальный, не из Explain)?


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

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


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

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


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

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