Join Elimination
This article describes how join elimination can improve performance of queries by removing tables from the plan.
oracle miscconfigurationintermediate
by OracleDba
14 views
This article describes how join elimination can improve performance of queries by removing tables from the plan.
12345678910111213141516171819202122232425262728
CREATE TABLE parent (
id NUMBER NOT NULL,
description VARCHAR2(50) NOT NULL,
CONSTRAINT parent_pk PRIMARY KEY (id)
);
INSERT INTO parent VALUES (1, 'PARENT ONE');
INSERT INTO parent VALUES (2, 'PARENT TWO');
COMMIT;
CREATE TABLE child (
id NUMBER NOT NULL,
parent_id NUMBER NOT NULL,
description VARCHAR2(50) NOT NULL,
CONSTRAINT child_pk PRIMARY KEY (id),
CONSTRAINT child_parent_fk FOREIGN KEY (parent_id) REFERENCES parent(id)
);
CREATE INDEX child_parent_fk_idx ON child(parent_id);
INSERT INTO child VALUES (1, 1, 'CHILD ONE');
INSERT INTO child VALUES (2, 1, 'CHILD ONE');
INSERT INTO child VALUES (3, 2, 'CHILD TWO');
INSERT INTO child VALUES (4, 2, 'CHILD TWO');
COMMIT;
EXEC DBMS_STATS.gather_table_stats(USER, 'PARENT');
EXEC DBMS_STATS.gather_table_stats(USER, 'CHILD');123456789101112
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT c.id, c.parent_id, c.description
FROM child c
JOIN parent p ON c.parent_id = p.id;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 64 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| CHILD | 4 | 64 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------12345678910111213141516171819202122
CREATE VIEW parent_child_v AS
SELECT p.id AS parent_id,
p.description AS parent_description,
c.id AS child_id,
c.parent_id AS child_parent_id,
c.description AS child_description
FROM child c
JOIN parent p ON c.parent_id = p.id;
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT child_id,
child_parent_id,
child_description
FROM parent_child_v;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 64 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| CHILD | 4 | 64 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------12345678910111213141516171819202122232425262728293031323334353637383940414243444546
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT parent_description,
child_id,
child_parent_id,
child_description
FROM parent_child_v;
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 120 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 4 | 120 | 5 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | PARENT | 2 | 28 | 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | CHILD_PARENT_FK_IDX | 2 | | 0 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| CHILD | 2 | 32 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT parent_id,
child_id,
child_parent_id,
child_description
FROM parent_child_v;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 64 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| CHILD | 4 | 64 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT p.id AS p_id, c.id, c.parent_id, c.description
FROM child c
JOIN parent p ON c.parent_id = p.id;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 64 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| CHILD | 4 | 64 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------1234567891011121314151617181920
ALTER TABLE child DROP CONSTRAINT child_parent_fk;
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT parent_id,
child_id,
child_parent_id,
child_description
FROM parent_child_v;
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 76 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 4 | 76 | 3 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PARENT_PK | 2 | 6 | 1 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | CHILD_PARENT_FK_IDX | 2 | | 0 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| CHILD | 2 | 32 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------Please to add comments
No comments yet. Be the first to comment!