Received: from malur.postgresql.org ([217.196.149.56])
by arkaria.postgresql.org with esmtp (Exim 4.84_2)
(envelope-from
rimig=3D# explain analyze select bitstr from=
bloomtest_bi where prop0 AND prop1 AND prop2 AND prop3 AND prop4 AND prop5=
AND prop6 AND prop7 AND prop8 AND prop9 AND prop10 AND prop11 AND prop12 A=
ND prop13 AND prop14 AND prop15 AND prop16 AND prop17 AND prop18 AND prop19=
AND prop20 AND prop21 AND prop22 AND prop23 AND prop24 AND prop25 AND prop=
26 AND prop27 AND prop28 AND prop29 AND prop30 AND prop31 AND prop32 AND pr=
op33 AND prop34 AND prop35 AND prop36 AND prop37 AND prop38 AND prop39 AND =
prop40 AND prop41 AND prop42 AND prop43 AND prop44 AND prop45 AND prop46 AN=
D prop47 AND prop48 AND prop49 AND prop50 AND prop51 AND prop52 AND prop53 =
AND prop54 AND prop55 AND prop56 AND prop57 AND prop58 AND prop59 AND prop6=
0 AND prop61 AND prop62 AND prop63 AND prop64; =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 =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 =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 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 QUERY PLAN =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 =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 =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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 --------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------- =C2=A0Seq Scan on bloomtest_bi=C2=A0 (cost=
=3D0.00..350770.00 rows=3D6 width=3D18) (actual time=3D229.365..2576.391 ro=
ws=3D9 loops=3D1) =C2=A0=C2=A0 Filter: (prop0 AND prop1 AND pr=
op2 AND prop3 AND prop4 AND prop5 AND prop6 AND prop7 AND prop8 AND prop9 A=
ND prop10 AND prop11 AND prop12 AND prop13 AND prop14 AND prop15 AND prop16=
AND prop17 AND prop18 AND prop19 AND prop20 AND prop21 AND prop22 AND prop=
23 AND prop24 AND prop25 AND prop26 AND prop27 AND prop28 AND prop29 AND pr=
op30 AND prop31 AND prop32 AND prop33 AND prop34 AND prop35 AND prop36 AND =
prop37 AND prop38 AND prop39 AND prop40 AND prop41 AND prop42 AND prop43 AN=
D prop44 AND prop45 AND prop46 AND prop47 AND prop48 AND prop49 AND prop50 =
AND prop51 AND prop52 AND prop53 AND prop54 AND prop55 AND prop56 AND prop5=
7 AND prop58 AND prop59 AND prop60 AND prop61 AND prop62 AND prop63 AND pro=
p64) =C2=A0=C2=A0 Rows Removed by Filter: 1199999=
1 =C2=A0Total runtime: 2576.420 ms (4 rows) Time: 2577.160 ms rimig=3D# explain analyze select bitstr from=
bloomtest_bi where bitstr =3D '111111111111111111111111111111111111111=
11111111111111111111111111011011101110011111100110001101000111';=
=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=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=
span> --------------------------------------------=
---------------------------------------------------------------------------=
------------------------- =C2=A0Index Only Scan using i_gist on bloomt=
est_bi=C2=A0 (cost=3D0.56..8.58 rows=3D1 width=3D18) (actual time=3D0.040..=
0.040 rows=3D1 loops=3D1) =C2=A0=C2=A0 Index Cond: (bitstr =3D B'1=
111111111111111111111111111111111111111111111111111111111111111101101110111=
0011111100110001101000111'::bit varying) =C2=A0=C2=A0 Heap Fetches: 1 =C2=A0Total runtime: 0.056 ms (4 rows) Time: 0.443 ms This gets all the results I n=
eed however it's slow.=C2=A0 rimig=3D=
# explain analyze select bitstr from bloomtest_bi where (bitstr & '=
111111111111111111111111111111111111111111111111111111111111111110000000000=
00000000000000000000000000' ) =3D '11111111111111111111111111111111=
111111111111111111111111111111111000000000000000000000000000000000000';=
=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 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QUERY PLAN=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ---------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------------------------------------=
---------------------------------------------- =C2=A0=C2=A0 Filter: (((bitstr):=
:"bit" & B'1111111111111111111111111111111111111111111111=
1111111111111111111000000000000000000000000000000000000'::"bit&quo=
t;) =3D B'1111111111111111111111111111111111111111111111111111111111111=
1111000000000000000000000000000000000000'::"bit")
=C2=A0Total runtime: 9359.593 ms<= /span>
(4 rows)
<=
span class=3D"">
Time: 9360.072 ms
Hey all,Lots of interesting suggestions! I'm lovi= ng it.Just came back to this a bit earlier today and ma= de a sample table to see what non-index performance would be. Constructed d= ata just like above (used 12M rows and 80% true for all 100 boolean columns= )Here's an analyze for what I'd expect to= be the types of queries that I'll be handling from the frontend. I wou= ld expect around 40-70 properties per query.Now I= 'm going to start experimenting with some ideas above and other tuning.= This isn't as bad as I thought it would be, though would like to get t= his under 200ms.rimig=3D# explain analyze select count(*) from bloomtest where pro= p0 AND prop1 AND prop2 AND prop3 AND prop4 AND prop5 AND prop6 AND prop7 AN= D prop8 AND prop9 AND prop10 AND prop11 AND prop12 AND prop13 AND prop14 AN= D prop15 AND prop16 AND prop17 AND prop18 AND prop19 AND prop20 AND prop21 = AND prop22 AND prop23 AND prop24 AND prop25 AND prop26 AND prop27 AND prop2= 8 AND prop29 AND prop30 AND prop31 AND prop32 AND prop33 AND prop34 AND pro= p35 AND prop36 AND prop37 AND prop38 AND prop39 AND prop40 AND prop41 AND p= rop42 AND prop43 AND prop44 AND prop45 AND prop46 AND prop47 AND prop48 AND= prop49 AND prop50 AND prop51 AND prop52 AND prop53 AND prop54 AND prop55 A= ND prop56 AND prop57 AND prop58 AND prop59 AND prop60 AND prop61 AND prop62= AND prop63 AND prop64;
=C2=A0Aggregate=C2=A0 (cost=3D351563.03..351563.04 rows=3D1 width= =3D0) (actual time=3D2636.829..2636.829 rows=3D1 loops=3D1)
=C2=A0=C2=A0 ->=C2=A0 Seq Scan on bloomtest=C2=A0 (cost=3D0.00.= .351563.02 rows=3D3 width=3D0) (actual time=3D448.200..2636.811 rows=3D9 lo= ops=3D1)
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 Filter: (prop0 AND prop1 AND pro= p2 AND prop3 AND prop4 AND prop5 AND prop6 AND prop7 AND prop8 AND prop9 AN= D prop10 AND prop11 AND prop12 AND prop13 AND prop14 AND prop15 AND prop16 = AND prop17 AND prop18 AND prop19 AND prop20 AND prop21 AND prop22 AND prop2= 3 AND prop24 AND prop25 AND prop26 AND prop27 AND prop28 AND prop29 AND pro= p30 AND prop31 AND prop32 AND prop33 AND prop34 AND prop35 AND prop36 AND p= rop37 AND prop38 AND prop39 AND prop40 AND prop41 AND prop42 AND prop43 AND= prop44 AND prop45 AND prop46 AND prop47 AND prop48 AND prop49 AND prop50 A= ND prop51 AND prop52 AND prop53 AND prop54 AND prop55 AND prop56 AND prop57= AND prop58 AND prop59 AND prop60 AND prop61 AND prop62 AND prop63 AND prop= 64)
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 Rows Removed by Filter: 11999991=
=C2=A0Total runtime: 2636.874 ms
On Thu, Apr 21, 2016 at 12:45 PM, Jeff Janes <jeff.ja= nes@gmail.com> wrote:On Wed, Apr 20, 2016 at 11:54 AM, Teodor Sigaev <teodor@sigaev.ru> wrote:
>>
>> The obvious thing seems to make a table with ~100 columns, with 1 = column
>> for each boolean property. Though, what type of indexing strategy = would
>> one use on that table? Doesn't make sense to do BTREE. Is ther= e a better
>> way to structure it?
>>
> looks like a deal for contrib/bloom index in upcoming 9.6 release
Not without doing a custom compilation with an increased INDEX_MAX_K= EYS:
ERROR:=C2=A0 cannot use more than 32 columns in an index
But even so, I'm skeptical this would do better than a full scan.=C2=A0= It
would be interesting to test that.
Cheers,
Jeff