Текущее время: Чт, мар 28 2024, 15:38

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


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


ВНИМАНИЕ! Прежде чем задавать вопрос, ознакомьтесь со ссылками ниже:

Вопросы по отличиям версий SAP, Add-On, EHP - сюда
Вопросы по SAP Front End (SAPlogon, SAPgui, guiXT и т.д.) - сюда
Вопросы по LSMW - сюда
Вопросы по архивации в SAP - сюда
Вопросы по SAP GRC - сюда
Вопросы по SAP Business Workplace (почте SAP) и SAP Office - сюда
Вопросы по miniSAP (SAP mini basis) - сюда
Вопросы по SAP HANA - сюда
Вопросы по лицензированию продуктов SAP - сюда



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Индексы для таблицы deftax_item
СообщениеДобавлено: Чт, фев 16 2017, 14:01 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 408
Всем доброго дня.

Возникла проблема с производительностью отчета (стандартный отчет книга покупо/продаж).
Оказалось, что "тормозит" такой запрос:

SELECT * INTO TABLE et_deftax_item FROM deftax_item
FOR ALL ENTRIES IN it_bkpf_dti
WHERE tbeln = it_bkpf_dti-belnr AND
tgjah = it_bkpf_dti-gjahr

В таблице deftax_item около 60 000 записей. Во внутренней таблице it_bkpf_dti около 900 записей.
Время выполнения - секунд 20.

Трассировка показывает, что индекс 005 не отрабатывает.

Если же я указываю индекс явно в запросе, то он выполняется меньше секунды:

SELECT * INTO TABLE et_deftax_item FROM deftax_item
FOR ALL ENTRIES IN it_bkpf_dti
WHERE tbeln = it_bkpf_dti-belnr AND
tgjah = it_bkpf_dti-gjahr
%_HINTS ORACLE 'INDEX("DEFTAX_ITEM" "DEFTAX_ITEM~005")' ."


По какой причине индекс 005 автоматически не срабатывает?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Чт, фев 16 2017, 15:34 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, янв 14 2013, 10:37
Сообщения: 795
Пол: Мужской
Добрый день, а наверно EXPLAIN запроса уже смотрели? Может он даст понять почему оптимизатор запросов начал обходится без индекса ?
DBACOCKPIT > производительность > session monitor > найти свою сессию, пока она крутит запрос > нажать explain. Цифры - шаги запроса, начинаются с 1, 2, 3...
Там есть кнопка "объяснить с советом" - скормите туда свой хинт и сравните стоимости запроса с хинтом и без. И там же есть трассировка оптимизатора, возможно в ней будет объяснение, почему оптимизатор так решил делать.
А еще может тупо статистика долго не пересобиралась, от этого крыша и поехала у него.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Чт, фев 16 2017, 19:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1246
Посмотрите, когда собиралась статистика по таблице. Может быть оптимайзер считает что у вас в табле мало данных и индекс не нужен.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Чт, фев 16 2017, 21:11 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 408
В дополнение, статистику пересобирал, индексы удалял и восстанавливал. Не помогает.
Причем, четыре первых индекса исправно работают.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 08:52 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 408
EXPLAIN:

SQL Statement

SELECT
/*+
INDEX(DEFTAX_ITEM DEFTAX_ITEM~005)
*/
*
FROM
"DEFTAX_ITEM"
WHERE
"MANDT"=:A0 AND "TBELN"=:A1 AND "TGJAH"=:A2 OR "MANDT"=:A3 AND "TBELN"=:A4 AND "TGJAH"=:A5 OR
"MANDT"=:A6 AND "TBELN"=:A7 AND "TGJAH"=:A8 OR "MANDT"=:A9 AND "TBELN"=:A10 AND "TGJAH"=:A11 OR
"MANDT"=:A12 AND "TBELN"=:A13 AND "TGJAH"=:A14


Execution Plan

SELECT STATEMENT ( Estimated Costs = 249 , Estimated #Rows = 64.480 )

1 TABLE ACCESS FULL DEFTAX_ITEM
( Estim. Costs = 249 , Estim. #Rows = 64.480 )
Estim. CPU-Costs = 99.150.249 Estim. IO-Costs = 242
Filter Predicates


А что нужно ввести в хинт, чтобы сравнить?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 11:08 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, янв 14 2013, 10:37
Сообщения: 795
Пол: Мужской
CrecerRu написал(а):
EXPLAIN:

SQL Statement

SELECT
/*+
INDEX(DEFTAX_ITEM DEFTAX_ITEM~005)
*/
*
FROM
"DEFTAX_ITEM"
WHERE
"MANDT"=:A0 AND "TBELN"=:A1 AND "TGJAH"=:A2 OR "MANDT"=:A3 AND "TBELN"=:A4 AND "TGJAH"=:A5 OR
"MANDT"=:A6 AND "TBELN"=:A7 AND "TGJAH"=:A8 OR "MANDT"=:A9 AND "TBELN"=:A10 AND "TGJAH"=:A11 OR
"MANDT"=:A12 AND "TBELN"=:A13 AND "TGJAH"=:A14


Execution Plan

SELECT STATEMENT ( Estimated Costs = 249 , Estimated #Rows = 64.480 )

1 TABLE ACCESS FULL DEFTAX_ITEM
( Estim. Costs = 249 , Estim. #Rows = 64.480 )
Estim. CPU-Costs = 99.150.249 Estim. IO-Costs = 242
Filter Predicates


А что нужно ввести в хинт, чтобы сравнить?


Ну в окошко объяснить с советом вводите свой хинт (без /*+ ... */) и он должен explain показать уже с учетом хинта, а сравнивать Estimated Costs ? Не работает так ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 11:35 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 408
Какой хинт сюда нужно подать для сравнения я не понял, но когда в АБАПЕ использую тотже запрос с хинтом, то результат такой:

С хинтом.
SELECT
/*+
INDEX("DEFTAX_ITEM" "DEFTAX_ITEM~005")
*/
*
FROM
"DEFTAX_ITEM"
WHERE
"MANDT"=:A0 AND "TBELN"=:A1 AND "TGJAH"=:A2 OR "MANDT"=:A3 AND "TBELN"=:A4 AND "TGJAH"=:A5 OR
"MANDT"=:A6 AND "TBELN"=:A7 AND "TGJAH"=:A8 OR "MANDT"=:A9 AND "TBELN"=:A10 AND "TGJAH"=:A11 OR
"MANDT"=:A12 AND "TBELN"=:A13 AND "TGJAH"=:A14

Execution Plan

SELECT STATEMENT ( Estimated Costs = 2.139 , Estimated #Rows = 64.480 )

3 INLIST ITERATOR

2 TABLE ACCESS BY INDEX ROWID DEFTAX_ITEM
( Estim. Costs = 2.139 , Estim. #Rows = 64.480 )
Estim. CPU-Costs = 103.944.628 Estim. IO-Costs = 2.132

1 INDEX RANGE SCAN DEFTAX_ITEM~005
( Estim. Costs = 321 , Estim. #Rows = 64.480 )
Search Columns: 3
Estim. CPU-Costs = 17.400.329 Estim. IO-Costs = 320
Access Predicates


Вопрос тот же, почему автоматически не срабатывает индекс?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 12:40 
Начинающий
Начинающий

Зарегистрирован:
Пт, фев 17 2017, 12:25
Сообщения: 3
Distinct этого индекса = 1 (по крайней мере у меня)
Column Name #Distinct
MANDT 1
TBELN 1
TGJAH 1

Поэтому oracle считает - дешевле не использовать индекс.
Что можно предпринять:
Попробовать снизить "Clustering factor" - CLSTFCT
exec DBMS_STATS.SET_INDEX_STATS('"SAPSR3"','"DEFTAX_ITEM~005"', CLSTFCT => 50, NO_INVALIDATE=>FALSE);
Но это временное решение, т.к. первый же сбор статистики вернет все на свои места.
Если это решение сработало, то можно попробовать реорганизовать таблицу с упорядочиванием данных относительно этого индекса.
Но тут надо все хорошо проверить, т.к. могут поплыть другие запросы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 13:31 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 408
to Oleg_ST.
Можно по подробнее, где я могу увидеть Distinct этого индекса?
И где нужно выполнить строку exec DBMS_STATS.SET_INDEX_STATS('"SAPSR3"','"DEFTAX_ITEM~005"', CLSTFCT => 50, NO_INVALIDATE=>FALSE);
Это обычный АБАП?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Индексы для таблицы deftax_item
СообщениеДобавлено: Пт, фев 17 2017, 13:52 
Начинающий
Начинающий

Зарегистрирован:
Пт, фев 17 2017, 12:25
Сообщения: 3
где я могу увидеть Distinct этого индекса?
db02 -> Diagnostics -> EXPLAN всавить запрос и слева вверху нажать "Explan"

где нужно выполнить строку
Это sql запрос, под пользователем ora<SID> набрать
sqlplus / as sysdba
далее эту строку

По этому поводу есть хорошая нота 832343 FAQ: Clustering factor


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

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


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

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


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

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