Re: Indexing on JSONB field not working

From: Zhihong Zhang <zhihong(at)gmail(dot)com>
To: Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com>
Cc: pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: Indexing on JSONB field not working
Date: 2019-12-21 01:15:39
Message-ID: E3D6070E-72E0-4FE5-9E30-D114530F383F@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Run those 2 EXPLAINs with seqscan off and on. See what difference it makes!

SET enable_seqscan = off;
explain analyze select id, _doc->>'floatValue' from assets where (_doc #> '{floatValue}'::text[])::double precision < 3.0 limit 100;

"Limit (cost=0.43..313.25 rows=100 width=53) (actual time=0.092..0.236 rows=7 loops=1)"
" -> Index Scan using assets_floatvalue_idx on assets (cost=0.43..2714072.57 rows=867607 width=53) (actual time=0.089..0.230 rows=7 loops=1)"
" Index Cond: (((_doc #> '{floatValue}'::text[]))::double precision < '3'::double precision)"
"Planning Time: 1.617 ms"
"Execution Time: 0.276 ms"

SET enable_seqscan = on;
explain analyze select id, _doc->>'floatValue' from assets where (_doc #> '{floatValue}'::text[])::double precision < 3.0 limit 100;

"Limit (cost=0.00..107.95 rows=100 width=53) (actual time=41021.311..313501.746 rows=7 loops=1)"
" -> Seq Scan on assets (cost=0.00..936605.40 rows=867607 width=53) (actual time=41021.309..313501.732 rows=7 loops=1)"
" Filter: (((_doc #> '{floatValue}'::text[]))::double precision < '3'::double precision)"
" Rows Removed by Filter: 2602824"
"Planning Time: 0.283 ms"
"Execution Time: 313501.777 ms"

Zhihong

> On Dec 20, 2019, at 5:30 PM, Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com> wrote:
>
> On Fri, Dec 20, 2019 at 04:52:17PM -0500, Zhihong Zhang wrote:
>> I have an index on JSONB fields like this,
>>
>>
>>
>> CREATE INDEX float_number_index_path2
>>
>> ON public.assets USING btree
>>
>> (((_doc #> '{floatValue}'::text[])::double precision) ASC NULLS LAST)
>>
>> TABLESPACE pg_default;
>>
>>
>>
>> However query doesn't use it,
>>
>>
>>
>> explain select id, _doc->>'floatValue' from assets where (_doc #>
>> '{floatValue}'::text[])::double precision < 3.0 limit 3;
>>
>>
>>
>> Limit (cost=0.00..3.24 rows=3 width=53)
>>
>> -> Seq Scan on assets (cost=0.00..936605.40 rows=867607 width=53)
>>
>> Filter: (((_doc #> '{floatValue}'::text[]))::double precision <
>> '3'::double precision)
>>
>>
>
> The index scan is likely expected to be more expensive than the plain
> sequential scan with the LIMIT interrupting it pretty much right away
> (it's expected to scan only ~0.0003% of the table.
>
> You can probably push the database to use the index by disabling
> sequential scans, i.e.
>
> SET enable_seqscan = off;
>
> and then doing the explain again.
>
> The interesting question however is which of the plans is faster. It's
> quite possible the database is making the right choice - index scans are
> not necessarily faster.
>
>>
>> The version of the database,
>>
>>
>>
>> "PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2
>> 20140120 (Red Hat 4.8.2-16), 64-bit"
>>
>>
>>
>> However, the index works for text field in JSONB.
>>
>
> Well, the text field probably has different statistics, so the
> sequential scan would have so scan much larger part of the table. Who
> knows - you haven't shared the execution plans.
>
>>
>>
>> Let me know if I can provide more information.
>>
>
> Show us explain analyze for both queries, with both index-scan and
> seq-scan (you'll have to use enable_seqscan and enable_indexscan to
> force the plan choice).
>
>
> regards
>
> --
> Tomas Vondra http://www.2ndQuadrant.com <http://www.2ndquadrant.com/>
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Michael Paquier 2019-12-21 02:26:32 Re: BUG #16161: pg_ctl stop fails sometimes (on Windows)
Previous Message Zhihong Zhang 2019-12-21 00:39:28 Re: Indexing on JSONB field not working