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

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


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

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


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

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