Re: Problem with slow query with WHERE conditions with OR clause on primary keys

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Krzysztof Olszewski wrote
> Hi,
> 
> my sql is very simple,
> returns one row,
> where conditions are assigned to primary keys
> 
> 
> */select g.gd_index, gd.full_name/**/
> /**/from gd g join gd_data gd on (g.id_gd = gd.id_gd)/**/
> /**/where gd.id_gd_data = 1111 OR g.id_gd = 1111;/*
> 
> 
> but generates "crazy" plan with Merge Join on big amount of rows (both
> tables contains 500000 rows)
> because Index scans ignore conditions, conditions are processed after
> index sacans on Merge Join
> 
> */Merge Join  (cost=0.00..46399.80 rows=2 width=115) (actual
> time=3.881..644.409 rows=1 loops=1)/**/
> /**/   Merge Cond: (g.id_gd = gd.id_gd)/**/
> /**/   Join Filter: ((gd.id_gd_data = 1111) OR (g.id_gd = 1111))/**/
> /**/   ->  Index Scan using pk_gd on gd g  (cost=0.00..14117.79
> rows=500001 width=40) (actual time=0.019..146.521 rows=500001 loops=1)/**/
> /**/   ->  Index Scan using fki_gd on gd_data gd  (cost=0.00..22282.04
> rows=500001 width=99) (actual time=0.016..157.384 rows=500001 loops=1)/**/
> /**/Total runtime: 644.460 ms/*
> 
> 
> model is very simple
> 
> 
> /CREATE TABLE gd (//
> //   id_gd bigint NOT NULL,//
> //   gd_index character varying(60) NOT NULL,//
> //   notes text,//
> //   notes_exists integer NOT NULL DEFAULT 0,//
> //   CONSTRAINT pk_gd PRIMARY KEY (id_gd )//
> //)//
> //
> //
> //CREATE TABLE gd_data (//
> //   id_gd_data bigint NOT NULL,//
> //   id_gd bigint NOT NULL,//
> //   short_name character varying(120) NOT NULL,//
> //   full_name character varying(512) NOT NULL,//
> //   notes text,//
> //   notes_exists integer NOT NULL DEFAULT 0,//
> //   CONSTRAINT pk_gd_data PRIMARY KEY (id_gd_data ),//
> //   CONSTRAINT fk_gd FOREIGN KEY (id_gd)//
> //       REFERENCES gd (id_gd) MATCH SIMPLE//
> //       ON UPDATE NO ACTION ON DELETE NO ACTION//
> //)//
> //
> //CREATE INDEX fki_gd//
> //   ON gd_data//
> //   USING btree//
> //   (id_gd );//
> /
> 
> 
> my configuration from (select * from pg_settings):
> 
> "server_version";"9.1.10"
> 
> Thank you for your help.
>   
> 
> Kris Olszewski

It cannot do any better since it cannot pre-filter either table using the
where condition without risking removing rows that would meet the other
table's condition post-join.

The query you are executing makes no sense to me: I don't understand why you
would ever filter on gd.id_gd_data given the model you are showing.

I believe your understanding of your model - or the model itself - is flawed
but as you have only provided code it is impossible to pinpoint where
exactly the disconnect resides.  You can either fix the model or the query -
the later by implementing sub-selects with where clauses manually - which
then encodes an assumption about your data that the current query cannot
make.

Your model implies that a single gd record can have multiple gd_data records
associated with it.

David J.





--
View this message in context: http://postgresql.1045698.n5.nabble.com/Problem-with-slow-query-with-WHERE-conditions-with-OR-clause-on-primary-keys-tp5782803p5782822.html
Sent from the PostgreSQL - performance mailing list archive at Nabble.com.


-- 
Sent via pgsql-performance mailing list (pgsql-performance@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance




[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux