powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса с left outer join
8 сообщений из 8, страница 1 из 1
Оптимизация запроса с left outer join
    #39324028
xserge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер !
Господа помогите советом.
Не получается оптимизировать запрос c left outer join, так чтобы не было full table scan (2 шт.) и cost был поменьше.


имеются 2 таблицы (поля и констраинты не имеющие отношения к вопросу я выкинул)

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
create table TableA
    (Id                             number(18,0) default 0 not null,
    Version                        number(18,0))
/

-- Indexes for TableA

create index Idx_TableA_Version on TableA
  (
    Version                         asc
  )
/

alter table TableA
add constraint Pk_TableA primary key (Id)
using index
/

create table TableB
    (Id                             number(18,0) not null,
    Version                        number(18,0),
    Querysend_Date                 date)
/

-- Indexes for TableB

create unique index Idx_TableB_Version on TableB
  (
    Version                         asc
  )
/

create index Idx_TableB_Id_Vers on TableB
  (
    Id                              asc,
    Version                         asc
  )
/

-- Constraints for TableB

alter table TableB
add constraint Pk_TableB primary key (Id)
using index
/

-- Foreign Key
alter table TableB
add constraint Fk_TableB_Stmtturn foreign key (Id)
references TableA (Id)
/



Во второй таблице не обязательно будет содержаться запись соответствующая записи в первой, поэтому использую left (outer) join
Мне нужно получить все записи (в объединении двух таблиц) значения поля version которых больше заданной.
в таблицах десятки миллионов записей.
интересно что если я заменяю left join на inner join от full table scan исчезает и cost становится маленьким,
что бы могли посоветовать чтобы избавиться от Full table scan и снизить cost используя внешнее объединение ?


Код: plaintext
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.
SQL_ID  az1y2cda66zcg, child number 0                                                                                       
-------------------------------------                                                                                       
select   T.Id   from          TableA T                                                       
       left join              TableB Stq                                                        
      on Stq.Id = T.Id   where   (T.Version > 1216913415 or Stq.Version> 1216913415)                                                                                                               
                                                                                                                            
Plan hash value: 105757921                                                                                                  

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name               | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                    |       |       | 38592 (100)|          |        |      |            |
|   1 |  PX COORDINATOR          |                    |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)    | :TQ10002           |     2 |    52 | 38592   (1)| 00:07:44 |  Q1,02 | P->S | QC (RAND)  |
|*  3 |    FILTER                |                    |       |       |            |          |  Q1,02 | PCWC |            |
|*  4 |     HASH JOIN RIGHT OUTER|                    |     2 |    52 | 38592   (1)| 00:07:44 |  Q1,02 | PCWP |            |
|   5 |      PX RECEIVE          |                    |  9350K|   115M|   962   (1)| 00:00:12 |  Q1,02 | PCWP |            |
|   6 |       PX SEND HASH       | :TQ10001           |  9350K|   115M|   962   (1)| 00:00:12 |  Q1,01 | P->P | HASH       |
|   7 |        PX BLOCK ITERATOR |                    |  9350K|   115M|   962   (1)| 00:00:12 |  Q1,01 | PCWC |            |
|*  8 |         TABLE ACCESS FULL|             TableB |  9350K|   115M|   962   (1)| 00:00:12 |  Q1,01 | PCWP |            |
|   9 |      BUFFER SORT         |                    |       |       |            |          |  Q1,02 | PCWC |            |
|  10 |       PX RECEIVE         |                    |  9350K|   115M| 37622   (1)| 00:07:32 |  Q1,02 | PCWP |            |
|  11 |        PX SEND HASH      | :TQ10000           |  9350K|   115M| 37622   (1)| 00:07:32 |        | S->P | HASH       |
|  12 |         TABLE ACCESS FULL|        TableA      |  9350K|   115M| 37622   (1)| 00:07:32 |        |      |            |
----------------------------------------------------------------------------------------------------------------------------
                                                                                                                            
Predicate Information (identified by operation id):                                                                         
---------------------------------------------------                                                                         
                                                                                                                            
   3 - filter(("T"."VERSION">1216913415 OR "STQ"."VERSION">1216913415))                                                     
   4 - access("STQ"."ID"="T"."ID")                                                                                          
   8 - access(:Z>=:Z AND :Z<=:Z)                                                                                            
                                                                                                                            
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324048
йцукенqwerty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xserge,

select T.Id from TableA T
where T.Version > 1216913415
union
select T.Id from TableA T
inner join TableB Stq
on Stq.Id = T.Id where (T.Version > 1216913415 or Stq.Version> 1216913415)
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324049
Не угадал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
йцукенqwertyxserge,

select T.Id from TableA T
where T.Version > 1216913415
union
select T.Id from TableA T
inner join TableB Stq
on Stq.Id = T.Id where (T.Version > 1216913415 or Stq.Version> 1216913415)

select T.Id from TableA T
where T.Version > 1216913415
intersect
select Stq.Id from TableB Stq
where Stq.Version> 1216913415
union
select T.Id from TableA T
where T.Version > 1216913415
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324515
xserge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо !
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324530
Фотография Takurava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не эквивалентные запросы.
Если на то пошло, нужно выбрать строки из "TableB" по условию "Version > 1216913415" и убедиться что такие "Id" есть в "TableA".
Код: plsql
1.
2.
3.
4.
5.
select Stq.Id from TableB Stq 
where Stq.Version> 1216913415 and exists (select 1 from TableA T where T.Id=Stq.Id)
union
select T.Id from TableA T 
where T.Version > 1216913415
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324596
Upstream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не угадалйцукенqwertyxserge,

select T.Id from TableA T
where T.Version > 1216913415
union
select T.Id from TableA T
inner join TableB Stq
on Stq.Id = T.Id where (T.Version > 1216913415 or Stq.Version> 1216913415)

select T.Id from TableA T
where T.Version > 1216913415
intersect
select Stq.Id from TableB Stq
where Stq.Version> 1216913415
union
select T.Id from TableA T
where T.Version > 1216913415


C union all вместо union будет быстрее.
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324601
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UpstreamC union all вместо union будет быстрее.

сколько открытий чуднЫх...
...
Рейтинг: 0 / 0
Оптимизация запроса с left outer join
    #39324658
Фотография Takurava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UpstreamC union all вместо union будет быстрее. Это если вы не против задвоения данных в результате:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select 1 from dual union select 1 from dual;
 
         1
----------
         1
 
SQL> select 1 from dual union all select 1 from dual;
 
         1
----------
         1
         1
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запроса с left outer join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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