Inequality operators are not deduced. - Mailing list pgsql-general

From ITAGAKI Takahiro
Subject Inequality operators are not deduced.
Date
Msg-id 20070216104828.651F.ITAGAKI.TAKAHIRO@oss.ntt.co.jp
Whole thread Raw
Responses Re: Inequality operators are not deduced.  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: Inequality operators are not deduced.  (ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp>)
List pgsql-general
Hello,

I found that the planner can decude equality operators,
but cannot decude inequality ones.
Are there any plans to improve handling of them?


I initialized tables as below.

    CREATE TABLE T (i INTEGER PRIMARY KEY);
    CREATE TABLE U (i INTEGER PRIMARY KEY);
    INSERT INTO T SELECT generate_series(1, 10000);
    INSERT INTO U SELECT generate_series(1, 100000);
    ANALYZE;


The planner can add an implicit equality operator, so the folloing
two plans are exactly the same, regardless of the redundant 'U.i = 100'.

EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i = 100;
EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i = 100 AND U.i = 100;
                              QUERY PLAN
----------------------------------------------------------------------
 Nested Loop  (cost=0.00..16.56 rows=1 width=8)
   ->  Index Scan using t_pkey on t  (cost=0.00..8.27 rows=1 width=4)
         Index Cond: (i = 100)
   ->  Index Scan using u_pkey on u  (cost=0.00..8.28 rows=1 width=4)
         Index Cond: (i = 100)


However, it seems to be inapplicable for inequality operators. The plan
was improved after I added the deduce-able 'U.i = 100' in theory.

EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i < 100;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Merge Join  (cost=0.00..340.38 rows=100 width=8)
   Merge Cond: (t.i = u.i)
   ->  Index Scan using t_pkey on t  (cost=0.00..10.00 rows=100 width=4)
         Index Cond: (i < 100)
   ->  Index Scan using u_pkey on u  (cost=0.00..3048.26 rows=100000 width=4)

EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i < 100 AND U.i < 100;
                               QUERY PLAN
-------------------------------------------------------------------------
 Merge Join  (cost=0.00..11.32 rows=1 width=8)
   Merge Cond: (t.i = u.i)
   ->  Index Scan using t_pkey on t  (cost=0.00..10.00 rows=100 width=4)
         Index Cond: (i < 100)
   ->  Index Scan using u_pkey on u  (cost=0.00..9.94 rows=96 width=4)
         Index Cond: (i < 100)


Just for the record, if forcing nested loop joins, plans were the follows.

SET enable_mergejoin = off;
SET enable_hashjoin = off;
EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i < 100;
                               QUERY PLAN
-------------------------------------------------------------------------
 Nested Loop  (cost=0.00..739.11 rows=100 width=8)
   ->  Index Scan using t_pkey on t  (cost=0.00..10.00 rows=100 width=4)
         Index Cond: (i < 100)
   ->  Index Scan using u_pkey on u  (cost=0.00..7.28 rows=1 width=4)
         Index Cond: (u.i = t.i)

EXPLAIN SELECT * FROM T, U WHERE T.i = U.i AND T.i < 100 AND U.i < 100;
                              QUERY PLAN
-----------------------------------------------------------------------
 Nested Loop  (cost=0.00..337.42 rows=1 width=8)
   ->  Index Scan using u_pkey on u  (cost=0.00..9.94 rows=96 width=4)
         Index Cond: (i < 100)
   ->  Index Scan using t_pkey on t  (cost=0.00..3.40 rows=1 width=4)
         Index Cond: ((t.i < 100) AND (t.i = u.i))

Regards,
---
ITAGAKI Takahiro
NTT Open Source Software Center


pgsql-general by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: How to use slash commands in a function
Next
From: Scott Ribe
Date:
Subject: Small request re error message