SAPфорум.RU https://sapboard.ru/forum/ |
|
Индексы для таблицы deftax_item https://sapboard.ru/forum/viewtopic.php?f=14&t=94426 |
Страница 1 из 1 |
Автор: | CrecerRu [ Чт, фев 16 2017, 14:01 ] |
Заголовок сообщения: | Индексы для таблицы deftax_item |
Всем доброго дня. Возникла проблема с производительностью отчета (стандартный отчет книга покупо/продаж). Оказалось, что "тормозит" такой запрос: 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 автоматически не срабатывает? |
Автор: | RikoNw [ Чт, фев 16 2017, 15:34 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
Добрый день, а наверно EXPLAIN запроса уже смотрели? Может он даст понять почему оптимизатор запросов начал обходится без индекса ? DBACOCKPIT > производительность > session monitor > найти свою сессию, пока она крутит запрос > нажать explain. Цифры - шаги запроса, начинаются с 1, 2, 3... Там есть кнопка "объяснить с советом" - скормите туда свой хинт и сравните стоимости запроса с хинтом и без. И там же есть трассировка оптимизатора, возможно в ней будет объяснение, почему оптимизатор так решил делать. А еще может тупо статистика долго не пересобиралась, от этого крыша и поехала у него. |
Автор: | Кодер [ Чт, фев 16 2017, 19:35 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
Посмотрите, когда собиралась статистика по таблице. Может быть оптимайзер считает что у вас в табле мало данных и индекс не нужен. |
Автор: | CrecerRu [ Чт, фев 16 2017, 21:11 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
В дополнение, статистику пересобирал, индексы удалял и восстанавливал. Не помогает. Причем, четыре первых индекса исправно работают. |
Автор: | CrecerRu [ Пт, фев 17 2017, 08:52 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
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 А что нужно ввести в хинт, чтобы сравнить? |
Автор: | RikoNw [ Пт, фев 17 2017, 11:08 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
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 ? Не работает так ? |
Автор: | CrecerRu [ Пт, фев 17 2017, 11:35 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
Какой хинт сюда нужно подать для сравнения я не понял, но когда в АБАПЕ использую тотже запрос с хинтом, то результат такой: С хинтом. 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 Вопрос тот же, почему автоматически не срабатывает индекс? |
Автор: | Oleg_ST [ Пт, фев 17 2017, 12:40 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
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); Но это временное решение, т.к. первый же сбор статистики вернет все на свои места. Если это решение сработало, то можно попробовать реорганизовать таблицу с упорядочиванием данных относительно этого индекса. Но тут надо все хорошо проверить, т.к. могут поплыть другие запросы. |
Автор: | CrecerRu [ Пт, фев 17 2017, 13:31 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
to Oleg_ST. Можно по подробнее, где я могу увидеть Distinct этого индекса? И где нужно выполнить строку exec DBMS_STATS.SET_INDEX_STATS('"SAPSR3"','"DEFTAX_ITEM~005"', CLSTFCT => 50, NO_INVALIDATE=>FALSE); Это обычный АБАП? |
Автор: | Oleg_ST [ Пт, фев 17 2017, 13:52 ] |
Заголовок сообщения: | Re: Индексы для таблицы deftax_item |
где я могу увидеть Distinct этого индекса? db02 -> Diagnostics -> EXPLAN всавить запрос и слева вверху нажать "Explan" где нужно выполнить строку Это sql запрос, под пользователем ora<SID> набрать sqlplus / as sysdba далее эту строку По этому поводу есть хорошая нота 832343 FAQ: Clustering factor |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |