Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1YYEAd-0005jv-UV for pgsql-sql@arkaria.postgresql.org; Wed, 18 Mar 2015 13:38:04 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1YYEAd-0004o0-99 for pgsql-sql@arkaria.postgresql.org; Wed, 18 Mar 2015 13:38:03 +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 1YYEAc-0004ns-FS for pgsql-sql@postgresql.org; Wed, 18 Mar 2015 13:38:02 +0000 Received: from post.visena.com ([46.226.10.50]) by magus.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1YYEAN-0001sq-8p for pgsql-sql@postgresql.org; Wed, 18 Mar 2015 13:38:01 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=visena.com; s=20141101.wh; h=Content-Type:MIME-Version:Subject:In-Reply-To:Message-ID:To:From:Date; bh=jcb8/Er/praswrbJmn3AtbFCh6zf8RUOrlC0nF13KLk=; b=h2D/V7dN7CdvC944q0ICCn6A8ld4rBIyZV0zGOST0Vb2qwe7u1Z1yxZB+374oN5P1ucSgs7DWWXZk5lZ6xSxrcGMjfUqmNU6BcbfFQi4O4WAQXEDjXcavEiULD8dXoLwfv+Woeyhp3iuU1wym6HXE7TJrc/IpFotTXRA5EEYdqo=; Received: from [10.0.1.10] (helo=tc7-visena.wh.internal.visena.com) by post.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1YYEAJ-0003ha-Pw for pgsql-sql@postgresql.org; Wed, 18 Mar 2015 14:37:46 +0100 Received: from localhost ([127.0.0.1] helo=tc7-visena.wh.internal.visena.com) by tc7-visena.wh.internal.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1YYEAK-0004uN-GJ for pgsql-sql@postgresql.org; Wed, 18 Mar 2015 14:37:44 +0100 Date: Wed, 18 Mar 2015 14:37:44 +0100 (CET) From: Andreas Joseph Krogh To: pgsql-sql@postgresql.org Message-ID: In-Reply-To: <1426684757283.55625@metametrics.co.uk> Subject: Re: Effective query for listing flags in use by messages in a folder 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_MESSAGE=0.001) X-Pg-Spam-Score: -2.0 (--) Content-Type: multipart/related; boundary="----=_Part_193_634221471.1426685864372" 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_192_1027744362.1426685864371 Content-Type: multipart/related; boundary="----=_Part_193_634221471.1426685864372" ------=_Part_193_634221471.1426685864372 Content-Type: multipart/alternative; boundary="----=_Part_194_1533871457.1426685864390" ------=_Part_194_1533871457.1426685864390 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable P=C3=A5 onsdag 18. mars 2015 kl. 14:19:18, skrev Hector Vass < hector.vass@metametrics.co.uk >: My= =20 recommendation is to hold the data as key value pairs not as a table with= =20 columns for each flag..=C2=A0 =C2=A0 Taking your table message ... and loading into this key value pair table=20 messaage2.. =C2=A0 drop type if exists myflags cascade; create type myflags as=20 enum('is_seen','is_replied','is_forwarded','is_deleted','is_draft','is_flag= ged'); drop table if exists message2; create table message2( =C2=A0 =C2=A0 folder_= id integer not=20 NULL, =C2=A0 =C2=A0 msg varchar(200), =C2=A0 =C2=A0 is_flag myflags ); inse= rt into message2 select=20 folder_id,msg,'is_seen' from message where is_seen is TRUE; insert into=20 message2 select folder_id,msg,'is_replied' from message where is_replied is= =20 TRUE; insert into message2 select folder_id,msg,'is_forwarded' from message= =20 where is_forwarded is TRUE; insert into message2 select=20 folder_id,msg,'is_deleted' from message where is_deleted is TRUE; insert in= to=20 message2 select folder_id,msg,'is_draft' from message where is_draft is TRU= E;=20 insert into message2 select folder_id,msg,'is_flagged' from message where= =20 is_flagged is TRUE; =C2=A0 select is_flag from message2 where folder_id=3D1= group by 1; =E2=80=8B work=3D# select is_flag from message2 where folder_id=3D1 group b= y 1; =C2=A0 is_flag=20 ------------ =C2=A0is_seen =C2=A0is_deleted =C2=A0is_replied (3 rows) =C2= =A0 New messages are=20 inserted into the message-table "all the time" and it seems quite expensive= to=20 keep this key-value table updated (which it must be, using triggers). =C2= =A0 My=20 version returns in sub-millisecond for a folder with > 100K messages in it,= =20 which I think is not bad, I just don't like the looks of the query and all = the=20 indexes required. =C2=A0 Thanks for looking into this. =C2=A0 -- Andreas Jo= seph Krogh CTO=20 / Partner - Visena AS Mobile: +47 909 56 963 andreas@visena.com=20 www.visena.com =20 =C2=A0 ------=_Part_194_1533871457.1426685864390 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: quoted-printable
P=C3=A5 onsdag 18. mars 2015 kl. 14:19:18, skrev Hector Vass <hector.vass@metametrics.co.uk>:

My recommendation is to h= old the data as key value pairs not as a table with columns for each flag..= =C2=A0

=C2=A0

Taking your table message= ... and loading into this key value pair table messaage2..

=C2=A0

drop type if exists myflags cascade;
create type myflags as enum('is_seen','is_replied','is_forwarded','is_= deleted','is_draft','is_flagged');
drop table if exists message2;
create table message2(
=C2=A0 =C2=A0 folder_id integer not NULL,
=C2=A0 =C2=A0 msg varchar(200),
=C2=A0 =C2=A0 is_flag myflags
);
insert into message2 select folder_id,msg,'is_seen' from message where= is_seen is TRUE;
insert into message2 select folder_id,msg,'is_replied' from message wh= ere is_replied is TRUE;
insert into message2 select folder_id,msg,'is_forwarded' from message = where is_forwarded is TRUE;
insert into message2 select folder_id,msg,'is_deleted' from message wh= ere is_deleted is TRUE;
insert into message2 select folder_id,msg,'is_draft' from message wher= e is_draft is TRUE;
insert into message2 select folder_id,msg,'is_flagged' from message wh= ere is_flagged is TRUE;
=C2=A0
select is_flag from message2 where folder_id=3D1 group by 1;
=E2=80=8B
work=3D# select is_flag from message2 where folder_id=3D1 group by 1;<= /div>
=C2=A0 is_flag
------------
=C2=A0is_seen
=C2=A0is_deleted
=C2=A0is_replied
(3 rows)
=C2=A0
New messages are inserted into the message-table "all the time&qu= ot; and it seems quite expensive to keep this key-value table updated (whic= h it must be, using triggers).
=C2=A0
My version returns in sub-millisecond for a folder with > 100K mess= ages in it, which I think is not bad, I just don't like the looks of the qu= ery and all the indexes required.
=C2=A0
Thanks for looking into this.
=C2=A0
=C2=A0
------=_Part_194_1533871457.1426685864390-- ------=_Part_193_634221471.1426685864372 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: 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 ------=_Part_193_634221471.1426685864372-- ------=_Part_192_1027744362.1426685864371--