Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1XGs36-0003Ih-6v for pgsql-sql@arkaria.postgresql.org; Mon, 11 Aug 2014 16:02:16 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1XGs35-0007op-Hw for pgsql-sql@arkaria.postgresql.org; Mon, 11 Aug 2014 16:02:15 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1XGs34-0007oi-Dy for pgsql-sql@postgresql.org; Mon, 11 Aug 2014 16:02:14 +0000 Received: from post.officenet.no ([195.225.13.103]) by magus.postgresql.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1XGs2w-00086p-F9 for pgsql-sql@postgresql.org; Mon, 11 Aug 2014 16:02:13 +0000 Received: from [10.47.1.10] (helo=tc7-on) by post.officenet.no with esmtp (Exim 4.76) (envelope-from ) id 1XGs2q-0008fv-Np for pgsql-sql@postgresql.org; Mon, 11 Aug 2014 18:02:05 +0200 Received: from localhost ([127.0.0.1] helo=tc7-on) by tc7-on with esmtp (Exim 4.76) (envelope-from ) id 1XGs29-000EIE-Vi for pgsql-sql@postgresql.org; Mon, 11 Aug 2014 18:01:18 +0200 Date: Mon, 11 Aug 2014 18:01:17 +0200 (CEST) From: Andreas Joseph Krogh To: pgsql-sql@postgresql.org Message-ID: Subject: How to optimize WHERE column_a IS NOT NULL OR column_b = 'value' MIME-Version: 1.0 X-Mailer: Visena Mail 1.9.0-SNAPSHOT X-Spam-Score: -1.0 X-Spam-Report: SpamAssasin (score=-1.0, required 5.0 ALL_TRUSTED=-1, HTML_IMAGE_ONLY_32=0.001, HTML_MESSAGE=0.001) X-Pg-Spam-Score: 0.0 (/) Content-Type: multipart/related; boundary="----=_Part_56_1297237996.1407772877843" List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org ------=_Part_55_2144238729.1407772877843 Content-Type: multipart/related; boundary="----=_Part_56_1297237996.1407772877843" ------=_Part_56_1297237996.1407772877843 Content-Type: multipart/alternative; boundary="----=_Part_57_640723076.1407772877871" ------=_Part_57_640723076.1407772877871 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi folks, =C2=A0 I have the following schema (simplified for this example).= =C2=A0 create=20 table folder(id integer primary key, name varchar not null); =C2=A0 create = table=20 document(id serial primary key, name varchar not null, owner_id integer not= =20 null, folder_id integer references folder(id)); create index document_owner= _idx=20 ON document(owner_id); create index document_folder_idx ON document(folder_= id);=20 =C2=A0 insert into folder(id, name) values(1, 'Folder A'); insert into fold= er(id,=20 name) values(2, 'Folder B'); insert into document(name, owner_id, folder_id= )=20 values('Document A',=C2=A0 1, 1); insert into document(name, owner_id, fold= er_id)=20 values('Document B',=C2=A0 1, NULL); insert into document(name, owner_id, f= older_id)=20 values('Document C',=C2=A0 2, 2); insert into document(name, owner_id, fold= er_id)=20 values('Document D',=C2=A0 2, NULL); =C2=A0 select f.id, f.name, doc.id, do= c.owner_id,=20 doc.name FROM document doc left outer join folder f ON doc.folder_id =3D f.= id=20 WHERE doc.folder_id is not null OR doc.owner_id =3D 1; =C2=A0=20 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN =20 ---------------------------------------------------------------------------= -------------------------------------------------- =C2=A0Nested Loop Left Join=C2=A0 (cost=3D0.15..13.77 rows=3D4 width=3D76)= (actual=20 time=3D0.031..0.045 rows=3D3 loops=3D1) =C2=A0=C2=A0 ->=C2=A0 Seq Scan on document doc=C2=A0 (cost=3D0.00..1.05 ro= ws=3D4 width=3D44) (actual=20 time=3D0.012..0.018 rows=3D3 loops=3D1) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Filter: ((folder_id IS NO= T NULL) OR (owner_id =3D 1)) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Rows Removed by Filter: 1 =C2=A0=C2=A0 ->=C2=A0 Index Scan using folder_pkey on folder f=C2=A0 (cost= =3D0.15..3.17 rows=3D1=20 width=3D36) (actual time=3D0.005..0.006 rows=3D1 loops=3D3) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Index Cond: (doc.folder_i= d =3D id) =C2=A0Planning time: 0.267 ms =C2=A0Execution time: 0.094 ms (8 rows) =C2=A0 =C2=A0 Is the a way to write a query which uses an index e= fficiently=20 for such a schema? =C2=A0 I'd like to eliminate the Filter: ((folder_id IS = NOT NULL)=20 OR (owner_id =3D 1)) and rather have "index cond" insted, is that possible?= =C2=A0 --=20 Andreas Joseph Krogh CTO / Partner - Visena AS Mobile: +47 909 56 963=20 andreas@visena.com www.visena.com=20 ------=_Part_57_640723076.1407772877871 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi folks,
=C2=A0
I have the following schema (simplified for this example).
=C2=A0
create table folder(id integer primary key, name varchar not null);
=C2=A0
create table document(id serial primary key, name varchar not null, ow= ner_id integer not null, folder_id integer references folder(id));
create index document_owner_idx ON document(owner_id);
create index document_folder_idx ON document(folder_id);
=C2=A0
insert into folder(id, name) values(1, 'Folder A');
insert into folder(id, name) values(2, 'Folder B');
insert into document(name, owner_id, folder_id) values('Document A',= =C2=A0 1, 1);
insert into document(name, owner_id, folder_id) values('Document B',= =C2=A0 1, NULL);
insert into document(name, owner_id, folder_id) values('Document C',= =C2=A0 2, 2);
insert into document(name, owner_id, folder_id) values('Document D',= =C2=A0 2, NULL);
=C2=A0
select f.id, f.name, doc.id, doc.owner_id, doc.name
FROM document doc left outer join folder f ON doc.folder_id =3D f.id
WHERE doc.folder_id is not null OR doc.owner_id =3D 1;
=C2=A0
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN
---------------------------------------------------------------------------= --------------------------------------------------
=C2=A0Nested Loop Left Join=C2=A0 (cost=3D0.15..13.77 rows=3D4 width=3D76) = (actual time=3D0.031..0.045 rows=3D3 loops=3D1)
=C2=A0=C2=A0 ->=C2=A0 Seq Scan on document doc=C2=A0 (cost=3D0.00..1.05 = rows=3D4 width=3D44) (actual time=3D0.012..0.018 rows=3D3 loops=3D1)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Filter: ((folder_id IS NOT= NULL) OR (owner_id =3D 1))
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Rows Removed by Filter: 1<= br> =C2=A0=C2=A0 ->=C2=A0 Index Scan using folder_pkey on folder f=C2=A0 (co= st=3D0.15..3.17 rows=3D1 width=3D36) (actual time=3D0.005..0.006 rows=3D1 l= oops=3D3)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Index Cond: (doc.folder_id= =3D id)
=C2=A0Planning time: 0.267 ms
=C2=A0Execution time: 0.094 ms
(8 rows)
=C2=A0
=C2=A0
Is the a way to write a query which uses an index efficiently for such= a schema?
=C2=A0
I'd like to eliminate the Filter: ((folder_id IS NOT NULL) OR (owner_i= d =3D 1)) and rather have "index cond" insted, is that possible?<= /div>
=C2=A0
--
Andrea= s Joseph Krogh
CTO / Partner<= /span> - Visena AS
Mobile: +47 90= 9 56 963
=3D""
------=_Part_57_640723076.1407772877871-- ------=_Part_56_1297237996.1407772877843 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: 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 ------=_Part_56_1297237996.1407772877843-- ------=_Part_55_2144238729.1407772877843--