powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить запрос с несколькими джоинами с пагинацией
9 сообщений из 9, страница 1 из 1
Ускорить запрос с несколькими джоинами с пагинацией
    #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
Ускорить запрос с несколькими джоинами с пагинацией
    #39629250
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arCHi_1887,

Стандартные средства для постраничного просмотра не подошли?
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #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
Ускорить запрос с несколькими джоинами с пагинацией
    #39629275
arCHi_1887
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, опечатался в джоине :) Не так уже медленно работает в итоге
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #39629333
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgoрarCHi_1887,

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

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

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

p.s. как то клиент жаловался, что ОЧЕНЬ медленно работает приложение, которое портировали с BTREE
4 девочки оператора загружали по самое нимогу неслабый сервер. Доходило до того, что при скоростном, слепом вводе документа, оператор обгонял сервер на 5-6 форм.
То есть оператор заканчивал печатать, а формочки все появлялись и появлялись :)
Разбор полетов показал, разработчик воспользовался автоматическим портированием приложения, и на любое нажатие клавиши, следовало select roiwid ... + очень "удобная" функция, подсказки доступных значений поля по мере ввода.
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #39629439
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim LejninНафига сервер нагружать работой клиента?
Клиент клиенту рознь, особливо в трехзвенке.
Сильно беспокоят беспокойные соседи? Можно повысить ставки до repeatable read.
...с 12 можно пользовать row_limiting_clause , что упрощает кодинг и последующий саппорт.
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #39629466
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous...с 12 можно пользовать row_limiting_clause , что упрощает кодинг и последующий саппорт.... и усложняет performance tuning во многих случаях делая невозможным достичь той же производительности с row_limiting_clause как без нее.
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #39629473
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop... и усложняет performance tuning во многих случаях делая невозможным достичь той же производительности с row_limiting_clause как без нее.
Прям таки во многих? :)
...
Рейтинг: 0 / 0
Ускорить запрос с несколькими джоинами с пагинацией
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ускорить запрос с несколькими джоинами с пагинацией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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