Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
OOsalivan
Member

Откуда:
Сообщений: 469
Есть большая таблица SALES которая часто обновляется. В ней много столбцов. Причем многие из этих столбцов ссылки (внешний ключ) на справочники DICT_1, DICT_2,... DIC_N. Клиенты онлайн запрашивают сводные данные и при этом формируеться запрос:

SELECT 
S.ID as ID,
RPAD(D1.NAME, 10) || LPAD(D1.NAME, 10) as NAME,
CASE
  WHEN D2.count > 0 THEN 'Y'
  ELSE 'N'
END
  as FLAG
D3.FIELD as SOME_FIELD_3
D4.FIELD as SOME_FIELD_4
D5.FIELD as SOME_FIELD_5

FROM SALES S,  DICT_1 D1, DICT_2 D2, DICT_3 D3, DICT_4 D4, DICT_5 D5
WHERE
        S.D1_ID = D1.ID(+) 
AND  S.D2_ID = D2.ID(+)
AND  S.D3_ID = D3.ID(+)
AND  S.D4_ID = D4.ID(+)
AND  S.D5_ID = D5.ID(+)

ORDER BY NAME;


Т.е джоинм в SALES справочники и при этом если нет такого справочника то забиваем поле NULL, затем на основании некоторых полей из справочника высчитываем поле для отображения клиенту, притом по всем полям может быть сортировка, включая и вычисляемые поля. Дело в том что без сортировки, запрос выполняется за приемлемое время, но когда появляется сортировка то производительность резко падает, план показал что это падение как раз на ORDER BY и джойнах.
Была идея использовать оракл материалайзд вью, но из за того что таблица SALES периодически обновляется отказался от этого.
Подскажите какие еще варианты ускорить подобный запрос существуют, или его может как то реорганизовать?
Заранее спасибо за советы!
20 апр 16, 11:14    [19081189]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
Avotge
Guest
OOsalivan
- если рез. набор небольшой, вывод не постраничный, может сортировать на клиенте?
- материализовать часть запроса (with), а уже над ней делать сортировки, но эффекта конечно может не дать :)
Смотреть как меняется план запроса при сортировке?
20 апр 16, 11:29    [19081288]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
OOsalivan
Member

Откуда:
Сообщений: 469
Avotge
OOsalivan
- если рез. набор небольшой, вывод не постраничный, может сортировать на клиенте?
- материализовать часть запроса (with), а уже над ней делать сортировки, но эффекта конечно может не дать :)
Смотреть как меняется план запроса при сортировке?


Вывод постраничный через веб, результирующий набор данных может быть большой
- материализовать часть запроса (with) - Какую именно часть? Просто в данном случае мы все джойним с основной таблицей как справочники, и что можно вынести в with непонятно
Да никак особо не меняется, просто добавляться ORDER BY
20 апр 16, 11:47    [19081441]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
miksoft
Member

Откуда:
Сообщений: 38545
OOsalivan
Подскажите какие еще варианты ускорить подобный запрос существуют, или его может как то реорганизовать?
У нас такого рода табличка живет в обычной таблице, обновляется триггерами на "подклеенных" таблицах.
20 апр 16, 11:49    [19081471]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
Egoр
Member

Откуда:
Сообщений: 829
OOsalivan,

OOsalivan
Вывод постраничный через веб, результирующий набор данных может быть большой

Без ORDER BY только первая страница быстро показывается или все до последней?
Если результирующий набор данных НЕ большой работает быстро?
20 апр 16, 11:50    [19081480]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
Avotge
Guest
Если рез. набор может быть большой, то сложновато по всем полям-то.
Или урезать набор (по датам или еще как), или ограничивать поля, по которым может быть сортировка.
20 апр 16, 11:55    [19081519]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
OOsalivan
.. и что можно вынести в with непонятно..

всё
ну или всё, кроме сортировки, хотя тут это пофиг разница
20 апр 16, 12:04    [19081597]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
OOsalivan
Member

Откуда:
Сообщений: 469
Egoр
OOsalivan,

OOsalivan
Вывод постраничный через веб, результирующий набор данных может быть большой

Без ORDER BY только первая страница быстро показывается или все до последней?
Если результирующий набор данных НЕ большой работает быстро?


тут идет работа через Java. Просто получаем ResultSet как курсор довольно быстро и итерируемся по нему отдавая на клиент результат, без ORDER BY курсор и итерация по нему занимают в десятки раз меньше времени, внезависимости от количества записей в результирующей выборке
20 апр 16, 12:15    [19081689]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
OOsalivan
Member

Откуда:
Сообщений: 469
Avotge
Если рез. набор может быть большой, то сложновато по всем полям-то.
Или урезать набор (по датам или еще как), или ограничивать поля, по которым может быть сортировка.

Набор урезается, т.е в исходном порядка 300 тысяч, а доп условия по WHERE обрезают его до 20 тысяч, но даже при таком количестве респонс длиться несколько секунд, что замораживает клиентский скрин
20 апр 16, 12:21    [19081722]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
OOsalivan
Avotge
Если рез. набор может быть большой, то сложновато по всем полям-то.
Или урезать набор (по датам или еще как), или ограничивать поля, по которым может быть сортировка.

Набор урезается, т.е в исходном порядка 300 тысяч, а доп условия по WHERE обрезают его до 20 тысяч, но даже при таком количестве респонс длиться несколько секунд, что замораживает клиентский скрин


а вот тут выбирайте, чего вам надо - быстро или правильно
20 апр 16, 12:35    [19081846]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
Avotge
Guest
OOsalivan, ну 20тыс. даже если по 20строк на страницу, это 1000страниц.
Вряд ли пользователю будет интересно листать все 1000страниц и есть подозрение, что сортировка и сделана для того, чтобы из этой 1000страниц достать "наверх" то что "нужнее". Имхо возможно, надо как-то переделать интерфейс, чтобы рез. набор был меньше.
20 апр 16, 12:40    [19081913]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с большим количеством LEFT OUTER JOIN  [new]
A_Askar
Guest
OOsalivan,

Хинты тебе в помощь
20 апр 16, 14:03    [19082548]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить