Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p6rAa-0003in-Cx for pgsql-performance@arkaria.postgresql.org; Sun, 18 Dec 2022 10:45:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1p6r9a-0003Eq-2X for pgsql-performance@arkaria.postgresql.org; Sun, 18 Dec 2022 10:44:22 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p6E69-0004J7-7z for pgsql-performance@lists.postgresql.org; Fri, 16 Dec 2022 17:02:13 +0000 Received: from mout.kundenserver.de ([212.227.17.10]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p6E61-0006Rb-8B for pgsql-performance@lists.postgresql.org; Fri, 16 Dec 2022 17:02:11 +0000 Received: from smtpclient.apple ([37.135.213.61]) by mrelayeu.kundenserver.de (mreue106 [213.165.67.118]) with ESMTPSA (Nemesis) id 1MQuPJ-1pJEfo2JCp-00NxyZ; Fri, 16 Dec 2022 18:01:59 +0100 From: "Render Comunicacion S.L." Message-Id: <16B10D64-A1BF-4522-9A6B-EB31F0622713@render.es> Content-Type: multipart/alternative; boundary="Apple-Mail=_8DF55F12-A7B1-4FA1-8052-640767B87EA6" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.200.110.1.12\)) Subject: Re: JSON down performacen when id:1 Date: Fri, 16 Dec 2022 18:01:47 +0100 In-Reply-To: <3675066.1671203211@sss.pgh.pa.us> Cc: pgsql-performance@lists.postgresql.org To: Tom Lane References: <3675066.1671203211@sss.pgh.pa.us> X-Mailer: Apple Mail (2.3731.200.110.1.12) X-Provags-ID: V03:K1:ZpLNx9KvG/C42KMJgdaYQ0bfUtJIcDsFVAaL9oRpBtrWaonWWIR c4qeFysCUz2c98RioG2Xyr3Kp14ohQDF+c/X9+QIjIRJ2jTRZO+vzi5mlg2BXPHcgrpOVpG 9RvIevBADRThSjV0yvIb/xPl7hGT87+cLnaiQqnF60U9N6EQ7OcdYOswb6wG/R4KAUFdbAL JxE3sZRIa2PRKOYMMkmeA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:NjiJrl3WH3Y=;xzIjUtLApWPdkAHVSGGV1mJQxso iOi0bcUlw8c/mEv4v8L2mt5fbyEpdYzp9PorHJEtdzlPrNs72QoL+hQdAxY+xnYLsGLtyS2dk pEXKD9m9wuascyZ8eAg0fbEgBQqnm0EJrHxDnLfmyBzThNFRLIeCk8wpW0pKPfkV1OaHJk68t sVntKx4TTjVte2null1MRBenwYKoVV+15S1XZMQe3jDqr7cPk+boLDXiF/n/JV0N4iuzvoaxE tQ2vsD/eRS5Y0i24WQQ9wKwyROz7KrhP+byCU7xMfs7GoaUuYwrUui9qKxdSj4j8erLt/uTe8 OHYbV+AW/hATnEGdPH4p7rhbKHMwZUqS6+PhorI2kiZB1Rf1dQjoY+Kse0hb2/F/cFaDRibLA R7SMa+X8boWB8VLTiBeOPp3Ldj0KpCFnE6t8rzPn7kfg+rm7hp4BaHBrEDv+Ks9dx/WzcwX/4 fKmx1NmTUkp4pEUK1/iu0VdJOnY29+WhCxFP/eAYlRLEEHUQKWIwgAe9Mhs5fskA+t2F7H5dR nX8cDzs1RjyEOOyaP5enYNeLYiNTjDpBaBRBXD/65G7W/5CEHta7YXHfPSpnFb+IySsxzuRaE fmolANFr0g3GQFWUxEi0WB7boR36txQDTBVilVp84f9R1PEv+rRPYfDLie54NE2IgAjW7uLgn QT8DwucdHY8Tpz87rLDdnvYxyG12v9OV7n3J8ZHY9Q== List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_8DF55F12-A7B1-4FA1-8052-640767B87EA6 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi Tom Thanks for your quick answer. I did not mention that the index for all tables is: CREATE INDEX IF NOT EXISTS matrix_relations_idx ON public.matrix USING gin ((datos #> '{relations}') jsonb_path_ops) TABLESPACE pg_default; And we try with and without jsonb_path_ops option with similar results. My question is about, what is the difference between the first 3 = searches and the > 4 search?=20 We don't know why in the first 3 cases seems that PostgreSQL doesn't use = the index, and the result takes the same time with or without index, and = the > 4, every number higher of 3, it works perfectly... We are really desperate about this...=20 Thanks in avance. Best Alex alex@render.es 657661974 =C2=B7 Denia 50, bajo izquierda =C2=B7 46006 =C2=B7 Valencia =EF=BF=BC > On 16 Dec 2022, at 16:06, Tom Lane wrote: >=20 > "Render Comunicacion S.L." writes: >> The issue: >> When we search our locator with section_id: 1 (or any number < 4), = PostgreSQL takes around 40000, 5000, 8000ms or more. >> When we search our locator with section_id: 4 (or any other bigger = number), PostgreSQL takes around 100 ms. ( ~ expected time) >=20 > Your index is providing pretty awful performance: >=20 >> -> Bitmap Heap Scan on matrix (cost=3D92.21..199.36 rows=3D27 = width=3D1144) (actual time=3D415.708..8325.296 rows=3D11 loops=3D1) >> Recheck Cond: ((datos #> '{relations}'::text[]) @> = '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb) >> Rows Removed by Index Recheck: 272037 >> Heap Blocks: exact=3D34164 lossy=3D33104 >> -> Bitmap Index Scan on matrix_relations_idx = (cost=3D0.00..92.20 rows=3D27 width=3D0) (actual time=3D61.462..61.462 = rows=3D155031 loops=3D1) >> Index Cond: ((datos #> '{relations}'::text[]) @> = '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb) >=20 > I read that as 155K hits delivered by the index, of which only 11 were > real matches. To make matters worse, with so many hits the bitmap was > allowed to become "lossy" (ie track some hits at page-level not > tuple-level) to conserve memory, so that the executor actually had to > check even more than 155K rows. >=20 > You need a better index. It might be that switching to a = jsonb_path_ops > index would be enough to fix it, or you might need to build an = expression > index matched specifically to this type of query. See >=20 > = https://www.postgresql.org/docs/current/datatype-json.html#JSON-INDEXING >=20 > Also, if any of the terminology there doesn't make sense, read >=20 > https://www.postgresql.org/docs/current/indexes.html >=20 > regards, tom lane >=20 >=20 --Apple-Mail=_8DF55F12-A7B1-4FA1-8052-640767B87EA6 Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_72D28486-61F4-4C5A-9FC2-2607A45B47FC" --Apple-Mail=_72D28486-61F4-4C5A-9FC2-2607A45B47FC Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Hi = Tom

Thanks for your quick = answer.

I did not mention that the index for = all tables is:

CREATE INDEX IF NOT EXISTS = matrix_relations_idx
    ON public.matrix USING = gin
    ((datos #> '{relations}') jsonb_path_ops) =  TABLESPACE pg_default;

And we try = with and without jsonb_path_ops option with similar = results.

My question is about, what is the = difference between the first 3 searches and the > 4 = search? 
We don't know why in the first 3 cases seems = that PostgreSQL doesn't use the index, and the result takes the same = time with or without index, and the > 4, every number higher of 3, it = works perfectly...

We are really desperate = about this... 

Thanks in = avance.

Best
Alex
alex@render.es


657661974 =C2=B7 Denia 50, = bajo izquierda =C2=B7 46006 =C2=B7 Valencia




On 16 Dec 2022, at 16:06, Tom = Lane <tgl@sss.pgh.pa.us> wrote:

"Render Comunicacion S.L." = <alex@render.es> writes:
The = issue:
When we search our locator with section_id: 1 (or any number = < 4), PostgreSQL takes around 40000, 5000, 8000ms or more.
When we = search our locator with section_id: 4 (or any other bigger number), = PostgreSQL takes around 100 ms. ( ~ expected = time)

Your index is providing pretty awful = performance:

=        ->  Bitmap Heap Scan = on matrix  (cost=3D92.21..199.36 rows=3D27 width=3D1144) (actual = time=3D415.708..8325.296 rows=3D11 loops=3D1)
=             &n= bsp;Recheck Cond: ((datos #> '{relations}'::text[]) @> = '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
=             &n= bsp;Rows Removed by Index Recheck: 272037
=             &n= bsp;Heap Blocks: exact=3D34164 lossy=3D33104
=             &n= bsp;->  Bitmap Index Scan on matrix_relations_idx =  (cost=3D0.00..92.20 rows=3D27 width=3D0) (actual = time=3D61.462..61.462 rows=3D155031 loops=3D1)
=             &n= bsp;      Index Cond: ((datos #> = '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": = "numisdata3"}]'::jsonb)

I read that as 155K hits = delivered by the index, of which only 11 were
real matches.  To = make matters worse, with so many hits the bitmap was
allowed to = become "lossy" (ie track some hits at page-level not
tuple-level) to = conserve memory, so that the executor actually had to
check even more = than 155K rows.

You need a better index.  It might be that = switching to a jsonb_path_ops
index would be enough to fix it, or you = might need to build an expression
index matched specifically to this = type of query. =  See

https://www.postgresql.org/docs/current/datatype-json.htm= l#JSON-INDEXING

Also, if any of the terminology there doesn't = make sense, = read

https://www.postgresql.org/docs/current/indexes.html

regards, = tom = lane



= --Apple-Mail=_72D28486-61F4-4C5A-9FC2-2607A45B47FC Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=pastedGraphic.tiff Content-Type: image/tiff; name="pastedGraphic.tiff" Content-Id: <2EC316D7-7065-4A3B-B9FB-4290239AC608> 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 --Apple-Mail=_72D28486-61F4-4C5A-9FC2-2607A45B47FC-- --Apple-Mail=_8DF55F12-A7B1-4FA1-8052-640767B87EA6--