Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить запрос с несколькими джоинами с пагинацией / 9 сообщений из 9, страница 1 из 1
12.04.2018, 15:31
    #39629240
arCHi_1887
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
Есть таблица master, и таблицы detail_1, detail_2, detail_3, detail_4.
В master и detail_1, detail_3, detail_4 порядка 15к строк, в detail_2 порядка 500 строк.
Запрос вида
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
  sq2.*
from
  (select
    sq.*, RowNum RN
  from 
      (select *
      from master m, detail_1 d1, detail_2 d2, detail_3 d3, detail_4 d4
      where m.ID = d1.FK_ID(+)
        and m.ID = d2.FK_ID(+)
        and m.ID = d3.FK_ID(+)
        and m.ID = d4.FK_ID(+)
      order by nvl(d1.Name1, d2.Name2)) sq1
  where RowNum <= :RightPageRange) sq2
where RN >= :LeftPageRange
order by nvl(d1.Name1, d2.Name2)


Индексы есть по всем FK_ID и d1.Name1, d2.Name2.

Работает очееень медленно.

Как ускорить?
...
Рейтинг: 0 / 0
12.04.2018, 15:40
    #39629250
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
arCHi_1887,

Стандартные средства для постраничного просмотра не подошли?
...
Рейтинг: 0 / 0
12.04.2018, 15:43
    #39629252
arCHi_1887
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
План такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 Plan Hash Value  : 992926317 

-----------------------------------------------------------------------------------------------
| Id   | Operation                     | Name                | Rows | Bytes | Cost | Time     |
-----------------------------------------------------------------------------------------------
|    0 | SELECT STATEMENT              |                     |    1 |   472 |  931 | 00:00:12 |
|    1 |   SORT ORDER BY               |                     |    1 |   472 |  931 | 00:00:12 |
|  * 2 |    VIEW                       |                     |    1 |   472 |  930 | 00:00:12 |
|    3 |     COUNT                     |                     |      |       |      |          |
|  * 4 |      FILTER                   |                     |      |       |      |          |
|    5 |       VIEW                    |                     |    1 |   459 |  930 | 00:00:12 |
|    6 |        SORT ORDER BY          |                     |    1 |   705 |  930 | 00:00:12 |
|    7 |         NESTED LOOPS OUTER    |                     |    1 |   705 |  929 | 00:00:12 |
|  * 8 |          HASH JOIN OUTER      |                     |    1 |   643 |    7 | 00:00:01 |
|  * 9 |           HASH JOIN OUTER     |                     |    1 |   276 |    5 | 00:00:01 |
| * 10 |            HASH JOIN OUTER    |                     |    1 |    39 |    3 | 00:00:01 |
|   11 |             INDEX FULL SCAN   | IDX_MASTER_ID       |    1 |    13 |    1 | 00:00:01 |
|   12 |             TABLE ACCESS FULL | DETAIL_3            |    1 |    26 |    2 | 00:00:01 |
|   13 |            TABLE ACCESS FULL  | DETAIL_1            |    1 |   237 |    2 | 00:00:01 |
|   14 |           TABLE ACCESS FULL   | DETAIL_2            |    1 |   367 |    2 | 00:00:01 |
|   15 |          VIEW                 |                     |    1 |    62 |  922 | 00:00:12 |
| * 16 |           FILTER              |                     |      |       |      |          |
|   17 |            TABLE ACCESS FULL  | DETAIL_4            |    1 |    62 |  922 | 00:00:12 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 2 - filter("RN">=NVL(:VLEFTPAGERANGE,"RN"))
* 4 - filter(ROWNUM<=NVL(:VRIGHTPAGERANGE,ROWNUM))
* 8 - access("SV"."ID"="SE"."X_ID"(+))
* 9 - access("SV"."ID"="SI"."X_ID"(+))
* 10 - access("SV"."ID"="SC"."X_ID"(+))
* 16 - filter("SV"."ID"="SC"."X_ID")
...
Рейтинг: 0 / 0
12.04.2018, 16:15
    #39629275
arCHi_1887
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
Прошу прощения, опечатался в джоине :) Не так уже медленно работает в итоге
...
Рейтинг: 0 / 0
12.04.2018, 17:08
    #39629333
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
EgoрarCHi_1887,

Стандартные средства для постраничного просмотра не подошли?
++

Нафига сервер нагружать работой клиента?

А теперь вопрос, что произойдёт, если пока Вы выбираете следующую/предыдущую страницу, отработает job который почистит 30% записей?

p.s. как то клиент жаловался, что ОЧЕНЬ медленно работает приложение, которое портировали с BTREE
4 девочки оператора загружали по самое нимогу неслабый сервер. Доходило до того, что при скоростном, слепом вводе документа, оператор обгонял сервер на 5-6 форм.
То есть оператор заканчивал печатать, а формочки все появлялись и появлялись :)
Разбор полетов показал, разработчик воспользовался автоматическим портированием приложения, и на любое нажатие клавиши, следовало select roiwid ... + очень "удобная" функция, подсказки доступных значений поля по мере ввода.
...
Рейтинг: 0 / 0
12.04.2018, 19:53
    #39629439
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
Vadim LejninНафига сервер нагружать работой клиента?
Клиент клиенту рознь, особливо в трехзвенке.
Сильно беспокоят беспокойные соседи? Можно повысить ставки до repeatable read.
...с 12 можно пользовать row_limiting_clause , что упрощает кодинг и последующий саппорт.
...
Рейтинг: 0 / 0
12.04.2018, 20:30
    #39629466
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
andrey_anonymous...с 12 можно пользовать row_limiting_clause , что упрощает кодинг и последующий саппорт.... и усложняет performance tuning во многих случаях делая невозможным достичь той же производительности с row_limiting_clause как без нее.
...
Рейтинг: 0 / 0
12.04.2018, 20:39
    #39629473
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
dbms_photoshop... и усложняет performance tuning во многих случаях делая невозможным достичь той же производительности с row_limiting_clause как без нее.
Прям таки во многих? :)
...
Рейтинг: 0 / 0
12.04.2018, 22:20
    #39629525
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить запрос с несколькими джоинами с пагинацией
arCHi_1887Есть таблица master, и таблицы detail_1, detail_2, detail_3, detail_4.
В master и detail_1, detail_3, detail_4 порядка 15к строк, в detail_2 порядка 500 строк.
Запрос вида
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
  sq2.*
from
  (select
    sq.*, RowNum RN
  from 
      (select *
      from master m, detail_1 d1, detail_2 d2, detail_3 d3, detail_4 d4
      where m.ID = d1.FK_ID(+)
        and m.ID = d2.FK_ID(+)
        and m.ID = d3.FK_ID(+)
        and m.ID = d4.FK_ID(+)
      order by nvl(d1.Name1, d2.Name2)) sq1
  where RowNum <= :RightPageRange) sq2
where RN >= :LeftPageRange
order by nvl(d1.Name1, d2.Name2)


Индексы есть по всем FK_ID и d1.Name1, d2.Name2.

Работает очееень медленно.

Как ускорить?

Ну первое что напрашивается, а что Вы хотите получить такой конструкцией?
1. sq1 - отсортирован - Ok
2. where RowNum <= :RightPageRange - развалит сортировку и RowNum RN будет находиться в хаосе
3. where RN >= :LeftPageRange - выберет какое-то количество строк из смеси
4. order by nvl(d1.Name1, d2.Name2) - отсортирует выбранные

На выходе Вы будете играть в угадайку, а не постраничный вывод, что следовало из названия переменных
Если Вы не пишите кнопку "Мне повезет", лучше перепишите селект правильно.

З.Ы. Для ускорения можете таблицы не учавствующие в этапе сортировки и первичных условий вывести в верхний селект
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить запрос с несколькими джоинами с пагинацией / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]