create table parent ( id number not null, description varchar2(20) not null, constraint parent_pk primary key (id) ); insert into parent values (1, ''); insert into parent values (2, ''); commit; create table child ( id number not null, parent_id number, description varchar2(20) not null ); insert into child values (1, 1, ''); insert into child values (2, 1, ''); insert into child values (3, 2, ''); insert into child values (4, 2, ''); commit;
explain plan for select c.id from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 36 | 2 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 4 | 36 | 2 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| CHILD | 4 | 24 | 2 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| PARENT_PK | 1 | 3 | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------- 3 - access("C"."PARENT_ID"="P"."ID")
alter table child add constraint child_parent_fk foreign key (parent_id) references parent(id); explain plan for select c.id from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 104 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CHILD | 4 | 104 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- 1 - filter("C"."PARENT_ID" IS NOT NULL)
create table parent2 ( id number not null, description varchar2(20) not null, constraint parent2_pk primary key (id) ); insert into parent2 values (3, ''); insert into parent2 values (4, ''); commit; create table parent3 ( id number not null, description varchar2(20) not null, constraint parent3_pk primary key (id) ); insert into parent3 values (5, ''); insert into parent3 values (6, ''); commit; alter table child add (parent2_id number, parent3_id number); alter table child add constraint child_parent2_fk foreign key (parent2_id) references parent2(id); merge into child c using ( select 1 id, 3 parent2_id, null parent3_id from dual union all select 2 id, 4 parent2_id, 5 from dual union all select 3 id, 3 parent2_id, 6 from dual union all select 4 id, 4 parent2_id, null from dual ) s on (c.id = s.id) when matched then update set c.parent2_id = s.parent2_id, c.parent3_id = s.parent3_id; commit;
explain plan for select c.id, c.description from child c left join parent3 p on c.parent3_id = p.id; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 100 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| CHILD | 4 | 100 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------
create or replace view child_parents_v as select c.id, c.parent_id, c.parent2_id, c.parent3_id, c.description, p1.description p1_desc, p2.description p2_desc, p3.description p3_desc from child c join parent p1 on c.parent_id = p1.id join parent2 p2 on c.parent2_id = p2.id left join parent3 p3 on c.parent3_id = p3.id; explain plan for select id from child_parents_v; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 156 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CHILD | 4 | 156 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- 1 - filter("C"."PARENT2_ID" IS NOT NULL AND "C"."PARENT_ID" IS NOT NULL)
explain plan for select * from child c where exists (select * from parent2 p where c.parent2_id = p.id); select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 256 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CHILD | 4 | 256 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- 1 - filter("C"."PARENT2_ID" IS NOT NULL)
explain plan for select * from child c where c.parent_id not in (select p.id from parent p); select * from table(dbms_xplan.display); ----------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 308 | 5 (0)| 00:00:01 | |* 1 | HASH JOIN ANTI SNA | | 4 | 308 | 5 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL | CHILD | 4 | 256 | 3 (0)| 00:00:01 | | 3 | INDEX FAST FULL SCAN| PARENT_PK | 2 | 26 | 2 (0)| 00:00:01 | ----------------------------------------------------------------------------------- 1 - access("C"."PARENT_ID"="P"."ID")
create or replace view child_child_v as select c.id, c.description c_desc, c2.description c2_desc from child c join child c2 on c.id = c2.id; alter table child add primary key(id); explain plan for select id, c2_desc from child_child_v; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 100 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| CHILD | 4 | 100 | 2 (0)| 00:00:01 | ---------------------------------------------------------------------------
explain plan for select c.id, c.description from child c where c.parent3_id is null and c.id in (select c2.id from child c2 where c2.id > 1); select * from table(dbms_xplan.display); ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS BY INDEX ROWID| CHILD | 1 | 38 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | SYS_C0013028957 | 3 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------- 1 - filter("PARENT3_ID" IS NULL) 2 - access("C2"."ID">1)
alter table child modify constraint child_parent_fk disable; alter table parent modify constraint parent_pk disable; explain plan for select c.id, c.description from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 204 | 6 (0)| 00:00:01 | |* 1 | HASH JOIN | | 4 | 204 | 6 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| PARENT | 2 | 26 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 152 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("C"."PARENT_ID"="P"."ID")
alter table child modify constraint child_parent_fk rely disable; alter table parent modify constraint parent_pk rely disable; explain plan for select c.id, c.description from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 152 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CHILD | 4 | 152 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- 1 - filter("C"."PARENT_ID" IS NOT NULL)
alter session set "_optimizer_join_elimination_enabled" = false; explain plan for select c.id, c.description from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 204 | 6 (0)| 00:00:01 | |* 1 | HASH JOIN | | 4 | 204 | 6 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| PARENT | 2 | 26 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 152 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("C"."PARENT_ID"="P"."ID")
alter session set "_optimizer_join_elimination_enabled" = false; explain plan for select /*+ ELIMINATE_JOIN(p) */ c.id, c.description from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 84 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| CHILD | 4 | 84 | 3 (0)| 00:00:01 | --------------------------------------------------------------------------- 1 - filter("C"."PARENT_ID" IS NOT NULL)
alter session set "_optimizer_join_elimination_enabled" = true; explain plan for select /*+ NO_ELIMINATE_JOIN(p) */ c.id, c.description from child c join parent p on c.parent_id = p.id; select * from table(dbms_xplan.display); -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4 | 96 | 3 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 4 | 96 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| CHILD | 4 | 84 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| PARENT_PK | 1 | 3 | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------- 3 - access("C"."PARENT_ID"="P"."ID")
select c.id from child c join parent p on p.id = c.parent_id join parent p2 on p2.id = c.parent_id join parent p3 on p3.id = c.parent_id where p.description = '' and p2.description = '' and p3.description = '' / select * from table(dbms_xplan.display_cursor(null, null, 'outline')) / ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 6 (100)| | |* 1 | HASH JOIN | | 2 | 102 | 6 (0)| 00:00:01 | |* 2 | TABLE ACCESS FULL| PARENT | 1 | 25 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 104 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("P3"."ID"="C"."PARENT_ID") 2 - filter("P3"."DESCRIPTION"='') Outline Data ------------- ... ELIMINATE_JOIN(@"SEL$EE94F965" "P"@"SEL$1") ELIMINATE_JOIN(@"SEL$EE94F965" "P2"@"SEL$2") ...
select c.id from child c where parent_id in (select /*+ qb_name(query_1) */ id from parent where description = '') and parent_id in (select /*+ qb_name(query_2) */id from parent where description = '') and parent_id in (select /*+ qb_name(query_3) */id from parent where description = '') / select * from table(dbms_xplan.display_cursor(null, null, 'outline')) / ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 6 (100)| | |* 1 | HASH JOIN | | 2 | 102 | 6 (0)| 00:00:01 | |* 2 | TABLE ACCESS FULL| PARENT | 1 | 25 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 104 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("PARENT_ID"="ID") 2 - filter("DESCRIPTION"='') Outline Data ------------- ... ELIMINATE_JOIN(@"SEL$45781D08" "PARENT"@"QUERY_3") ELIMINATE_JOIN(@"SEL$45781D08" "PARENT"@"QUERY_2") ... UNNEST(@"QUERY_3") UNNEST(@"QUERY_2") UNNEST(@"QUERY_1") ...
alter table child drop constraint child_parent_fk / select c.id from child c join parent p on p.id = c.parent_id join parent p2 on p2.id = c.parent_id join parent p3 on p3.id = c.parent_id where p.description = '' and p2.description = '' and p3.description = '' / select * from table(dbms_xplan.display_cursor(null, null, 'LAST OUTLINE')) / ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 6 (100)| | |* 1 | HASH JOIN | | 2 | 102 | 6 (0)| 00:00:01 | |* 2 | TABLE ACCESS FULL| PARENT | 1 | 25 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 104 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("P3"."ID"="C"."PARENT_ID") 2 - filter("P3"."DESCRIPTION"='') Outline Data ------------- ... ELIMINATE_JOIN(@"SEL$EE94F965" "P"@"SEL$1") ELIMINATE_JOIN(@"SEL$EE94F965" "P2"@"SEL$2") ...
alter session set "_optimizer_join_elimination_enabled" = false / select c.id from child c join parent p on p.id = c.parent_id join parent p2 on p2.id = c.parent_id join parent p3 on p3.id = c.parent_id where p.description = '' and p2.description = '' and p3.description = '' / select * from table(dbms_xplan.display_cursor(null, null, 'OUTLINE')) / ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 6 (100)| | |* 1 | HASH JOIN | | 2 | 102 | 6 (0)| 00:00:01 | |* 2 | TABLE ACCESS FULL| PARENT | 1 | 25 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| CHILD | 4 | 104 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------- 1 - access("P3"."ID"="C"."PARENT_ID") 2 - filter("P3"."DESCRIPTION"='') Outline Data ------------- ... ELIMINATE_JOIN(@"SEL$EE94F965" "P"@"SEL$1") ELIMINATE_JOIN(@"SEL$EE94F965" "P2"@"SEL$2") ...
select /*+ no_eliminate_join(p) no_eliminate_join(p2) no_eliminate_join(p3) */ c.id from child c join parent p on p.id = c.parent_id join parent p2 on p2.id = c.parent_id join parent p3 on p3.id = c.parent_id where p.description = '' and p2.description = '' and p3.description = '' / select * from table(dbms_xplan.display_cursor()) / -------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 8 (100)| | | 1 | NESTED LOOPS | | 1 | 101 | 8 (0)| 00:00:01 | | 2 | NESTED LOOPS | | 1 | 101 | 8 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 1 | 76 | 8 (0)| 00:00:01 | |* 4 | HASH JOIN | | 2 | 102 | 6 (0)| 00:00:01 | |* 5 | TABLE ACCESS FULL | PARENT | 1 | 25 | 3 (0)| 00:00:01 | | 6 | TABLE ACCESS FULL | CHILD | 4 | 104 | 3 (0)| 00:00:01 | |* 7 | TABLE ACCESS BY INDEX ROWID| PARENT | 1 | 25 | 1 (0)| 00:00:01 | |* 8 | INDEX UNIQUE SCAN | PARENT_PK | 1 | | 0 (0)| | |* 9 | INDEX UNIQUE SCAN | PARENT_PK | 1 | | 0 (0)| | |* 10 | TABLE ACCESS BY INDEX ROWID | PARENT | 1 | 25 | 0 (0)| | -------------------------------------------------------------------------------------------- 4 - access("P"."ID"="C"."PARENT_ID") 5 - filter("P"."DESCRIPTION"='') 7 - filter("P2"."DESCRIPTION"='') 8 - access("P2"."ID"="C"."PARENT_ID") 9 - access("P3"."ID"="C"."PARENT_ID") 10 - filter("P3"."DESCRIPTION"='')
drop view child_parents_v; drop view child_child_v; drop table child; drop table parent; drop table parent2; drop table parent3;
Source: https://habr.com/ru/post/248817/
All Articles