Hi

I was just wondering whether inner join elimination is working in postgres, so 
I put up a simple test case and compared it with an Oracle database (see output 
below).
It doesn't look like this feature is implemented in postgres, or am I missig 
something?
Are there any plans to implement it in the future?

-----------------------------------------
* Oracle 11.2
----------------------------------------

CREATE TABLE m ( 
   i INTEGER NOT NULL,
   c VARCHAR(10),
   CONSTRAINT m_pk PRIMARY KEY(i)
);


CREATE TABLE c ( 
   i INTEGER NOT NULL,
   created_tm DATE NOT NULL,
   CONSTRAINT c_pk PRIMARY KEY(i, created_tm),
   CONSTRAINT c_m_fk FOREIGN KEY(i) REFERENCES m
);

explain plan for    
select c.*
from m
  join c
    ON (m.i = c.i);    
    
select *
from table(dbms_xplan.display);    

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    22 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| C    |     1 |    22 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

----------------------------------------
* postgres 11-beta
----------------------------------------

CREATE TABLE m ( 
   i INTEGER NOT NULL,
   c VARCHAR(10),
   CONSTRAINT m_pk PRIMARY KEY(i)
);


CREATE TABLE c ( 
   i INTEGER NOT NULL,
   created_tm timestamp NOT NULL,
   CONSTRAINT c_pk PRIMARY KEY(i, created_tm),
   CONSTRAINT c_m_fk FOREIGN KEY(i) REFERENCES m
);


explain  
select c.*
from m
  join c
    ON (m.i = c.i);    
    
                           QUERY PLAN                            
-----------------------------------------------------------------
Hash Join  (cost=36.10..92.24 rows=2040 width=12)
   Hash Cond: (c.i = m.i)
   ->  Seq Scan on c  (cost=0.00..30.40 rows=2040 width=12)
   ->  Hash  (cost=21.60..21.60 rows=1160 width=4)
         ->  Seq Scan on m  (cost=0.00..21.60 rows=1160 width=4)

Reply via email to