Текущее время: Пт, авг 01 2025, 15:01

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 11:59 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 15 2009, 11:39
Сообщения: 26
Откуда: Москва
Пол: Женский
Коллеги, помогите разобраться. В наследство достался такой код.

SELECT * INTO ...
FROM tab1
INNER JOIN tab2 ON tab2~field = tab1~field
tab2~ ... = tab1~
INNER JOIN tab3 ON tab3~field = tab1~field
WHERE
tab1~field1 = Константа and
tab1~field2 =...

Есть индексы в всех полях соответствующих таблиц

В результе трассировки выяснилось работает так:
1. TABLE ACCESS FULL в таблице tab2
2. TABLE ACCESS FULL в таблице tab3
3. Далее JOIN tab2 и tab3
4. Выбор из tab1 по индексу и JOIN.

Соответственно работает медленно. Предполагалось первой пойдет выборка из tab1.
Есть идеи как побороть ситуацию без разбиения с for all entries?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 12:11 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Какая субд?
Сколько записей в таблице1, таблице2 и таблице3?
Какой джойн между таблицей2 и таблицей3? (HASH, MERGE)

Приведите полные условия соединений всех таблиц.
Приведите полные списки полей в индексах.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 12:25 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 15 2009, 11:39
Сообщения: 26
Откуда: Москва
Пол: Женский
Какая субд?
Оракл

Сколько записей в таблице1, таблице2 и таблице3?
tab1 - 578 969
tab2 - 224 925
tab3 - 810 521

Какой джойн между таблицей2 и таблицей3? (HASH, MERGE)
hash

Приведите полные условия соединений всех таблиц.
SELECT DISTINCT *
INTO ...
FROM tab1
INNER JOIN tab2 ON tab2~trdoc = tab1~trdoc
INNER JOIN tab3 ON tab3~trdoc = tab1~trdoc
AND tab3~vrsio = tab1~vrsio
WHERE tab1~rfcdest = Constanta
AND ( ( tab1~send_status IN ('E', 'S', 'W', '') ) OR ( tab1~answer_status IN ('E', 'W', '') ) ) .

Приведите полные списки полей в индексах
.
tab1:
-Первичный ключ (trdoc, vrsio)
-Индекс(rfcdest+send_status+answer_status )

tab2:
-Первичный ключ (trdoc)

tab3:
-Индекс(trdoc,vrsio,trpos)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 12:36 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Весьма странное повдение для таких исходных данных.

Рекомендую пересобрать статистику по всем таблицам (или попросить об этом базис).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 13:16 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 15 2009, 11:39
Сообщения: 26
Откуда: Москва
Пол: Женский
уже прогоняли статистику, ничего не изменилось(


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 13:33 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, авг 28 2006, 11:24
Сообщения: 292
Пол: Мужской
Выглядит так, будто БД индексов не видит.
Точно ли индексы активны и существуют для вашей БД?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 13:52 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Rokhay написал:
Выглядит так, будто БД индексов не видит.
Точно ли индексы активны и существуют для вашей БД?

Судя по предоставленным данным FULL SCANа для таблицы 2 быть все равно не должно.
Даже в случае отсутвия вторичных индексов на таблицу1 и таблицу3.
Хотя есть вероятность что оптимизатор считает более продуктивным построением HASH таблицы по таблице2.

Присоединяюсь к Rokhay:
проверьте что все индексы активны и созданы как Index in all database systems.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:01 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Скорее всего оптимизатор решил, что ограничение по полям tab1 мало влияет на результат выборки из этой таблицы и поэтому берет основной таблицей для выборки tab2, в которой меньше всего записей.
Кстати, индекс на tab1 rfcdest, send_status, answer_status лучше разбить на 2: rfcdest, send_status и rfcdest, answer_status

И сделать хотя бы еще одно ограничение, например по датам.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:10 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Удав написал(а):
Скорее всего оптимизатор решил, что ограничение по полям tab1 мало влияет на результат выборки из этой таблицы и поэтому берет основной таблицей для выборки tab2, в которой меньше всего записей.

Скорее всего да, селективность малая. Но даже в таком случае( FULL SCAN по таблице2 с построением HASHа ) обращение к таблице3 должно идти по индексу, а никак не полным перебором.
Цитата:
Кстати, индекс на tab1 rfcdest, send_status, answer_status лучше разбить на 2: rfcdest, send_status и rfcdest, answer_status

:shock:
ИМХО, очень спорно.
Я бы скорее посоветовал включить в индекс trdoc, vrsio. Иначе получаем хоть и малозатратную операцию доступа к строке по индексу, но все же.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:14 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 15 2009, 11:39
Сообщения: 26
Откуда: Москва
Пол: Женский
все индексы существуют во всех БД и активны

Прогон статистики в системе разработки (небольшое количество) дает положительный результат, выборка идет из tab1 как и задумано
Прогон статистики в продуктиве (количество описано выше) не помогает, идет полная выборка из tab2 и tab3


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:23 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
yes, а в таблице 1 в продуктиве сколько записей, для которых выполняется условие
Code:
tab1~rfcdest = Constanta
AND ( ( tab1~send_status IN ('E', 'S', 'W', '') ) OR ( tab1~answer_status IN ('E', 'W', '') ) ) .

?

Ну и таки попробуйте засунуть в индекс trdoc и vrsio для таблицы1 с прогоном статистики.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:31 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 15 2009, 11:39
Сообщения: 26
Откуда: Москва
Пол: Женский
[quote="Пономарев Артем"]yes, а в таблице 1 в продуктиве сколько записей, для которых выполняется условие
Code:
tab1~rfcdest = Constanta
AND ( ( tab1~send_status IN ('E', 'S', 'W', '') ) OR ( tab1~answer_status IN ('E', 'W', '') ) ) .

?

~34 000


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 14:58 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
yes,
поведение вашего продуктива аномально.
Должен смотрть базис.
Возможно неверно настроены параметры, затрагивающие оптимизатор.
Вы же пока можете приписать:
Code:
%_HINTS ORACLE 'INDEX ( "таблица1" "таблица1~индекс")'.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 15:54 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Пономарев Артем написал:
Удав написал(а):
Кстати, индекс на tab1 rfcdest, send_status, answer_status лучше разбить на 2: rfcdest, send_status и rfcdest, answer_status
:shock:
ИМХО, очень спорно.
Я бы скорее посоветовал включить в индекс trdoc, vrsio. Иначе получаем хоть и малозатратную операцию доступа к строке по индексу, но все же.

Да ну :)
Code:
  SELECT COUNT( * ) INTO trfc_count
      FROM arfcsstate
      WHERE ( arfcfnam = 'IDOC_INBOUND_ASYNCHRONOUS'
        OR  arfcfnam = 'INBOUND_IDOC_PROCESS' )
      AND arfcreserv LIKE mfeld.

А вот план выполнения для этого запроса:
Code:
SELECT STATEMENT                                                   
                                                                   
    5  6 SORT AGGREGATE                                             
                                                                   
        5  5 CONCATENATION                                         
                                                                   
            5  2 TABLE ACCESS BY INDEX ROWID ARFCSSTATE             
                                                                   
                   1 INDEX RANGE SCAN ARFCSSTATE~03                 
                     Search Columns: 1                             
                                                                   
            5  4 TABLE ACCESS BY INDEX ROWID ARFCSSTATE             
                                                                   
                   3 INDEX RANGE SCAN ARFCSSTATE~03                 
                     Search Columns: 1                             

Оптимизатор ORACLE в данном случае разбивает SQL на 2 подзапроса и в каждом из них пытается выбрать индекс.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: inner join нескольких таблиц, порядок обработки
СообщениеДобавлено: Ср, апр 15 2009, 15:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Пономарев Артем написал:
yes,
поведение вашего продуктива аномально.
Должен смотрть базис.
Возможно неверно настроены параметры, затрагивающие оптимизатор.
Вы же пока можете приписать:
Code:
%_HINTS ORACLE 'INDEX ( "таблица1" "таблица1~индекс")'.

Подробнее про хинты Oracle можно посмотреть в ноте 130480

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

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


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

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


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

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