Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhmtR-006BiG-2S for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 10:53:58 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vhmtQ-00Cqoz-2d for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 10:53:57 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhmtQ-00Cqor-1Z for pgsql-hackers@lists.postgresql.org; Mon, 19 Jan 2026 10:53:56 +0000 Received: from mail-lf1-x132.google.com ([2a00:1450:4864:20::132]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vhmtO-001K4r-1b for pgsql-hackers@lists.postgresql.org; Mon, 19 Jan 2026 10:53:56 +0000 Received: by mail-lf1-x132.google.com with SMTP id 2adb3069b0e04-59b672f8ec4so4505021e87.1 for ; Mon, 19 Jan 2026 02:53:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1768820031; cv=none; d=google.com; s=arc-20240605; b=dCV7gJjr7FTxvhs+ovHQ/NLp3QC3EmwZaUD1N4fq9vHY0FLFJobpqNPs0f6clSng8h AkoKBwrIo275tshb7D8KGC09su16tfRk55Yv2HhZ/xceK3fIUDr7gJU54f+DWaNee+a0 vTZCVuEtXi44TzUVhUUYpShH6v27BzsbD/o8r0IDsCQ4ODZbrDN8y6J/dZ0ecFoclN+N gf/UV5S3WmsMuqxt81JJ0mLXjbfDHctIL1tGvNMkZ4OpVD/9V08bjJrPWwIcFXV1AWYv pe2cdk8oaS6GVhhNxtbQAz5o/Dcmrpbg/Gf4t3GHK4ayaDLN31Q+7c1hwMBXdA38VB6T oX3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Mu0mwxdHOT9gU9PwknNM3gBnZDKa3k21wIKiOnqtYv4=; fh=HfvV7Yg7wJBiCeJ4JHQNgc8/pRppdGrcUI6P91g+LDs=; b=OS/dEn9Mrm1np15v0zkSXSX2V4XfeaplOacogCo4+F/7Vcda93GDuDZ9j/AZzoqqBO AjAq38HgCbYn++98ldtp7GMes5kwmjADRvXI+uPuKX3nalij6cy7jnLGacJhM7nI4S37 u6NSFK0zGRsP6nj2yJ2EMCzb4x/Ljp198DBaA/oNAz1JEJ6EApNP7Q2N2hNTsJffCuml kJVPd6bzdl7gJijGr/7Tl82L7gDBlH66YOA9BIWHHkWczQlOU7z17YKEAMT7xI0jhnDm iXjRYxjyqRflorGISikdTr+cTvyq23hUc586ruhof9gLLOG10mdC/wso9n1DhXc1ttwo hqAg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1768820031; x=1769424831; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Mu0mwxdHOT9gU9PwknNM3gBnZDKa3k21wIKiOnqtYv4=; b=Dh7QCwNGfiHIsIrHutu6LIXi668HTESw56hlya4Szbzzbt4K5CyzhxyVuul8yodCFI HOdKXn9o4AaOKiB2gq3Zf5Ibl1059l4BdgGngKgphU6xCgo3wGqhmZnOvlKRFOc4c4+P 7L9j0JoJ0mUV74eNR4c2g+a0Po+s73Rsy6rRRIb4e81dWmdlAesZImfhFQnRijnRBkMe 1b/qdwJId9bCe3IlgL1pXI/Fv8Co/2ActieawM64OABDJgxoNWZUKzFBmXd1AE+O25GN g5ATYEr11Akt3tQuAES7oJ4GIG1Hl2OXnV00IYIS+4NoxkigUI4/GkCkzNFRvBSEGmvM xuVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768820031; x=1769424831; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Mu0mwxdHOT9gU9PwknNM3gBnZDKa3k21wIKiOnqtYv4=; b=DspJ4yxWoJYze6dpqEf0RukfTv3yHmwhx0X4Pa/NFNry+bRd3FYLa5wbmGWp5mXmcp cXnedbdCSvxPUE+gvoBSsSgRq4zBa4rr7rOPCoN6NZd9BZTKvefw2ecMykAApVVndMp+ wiBwkdGJl5pgFrQlNlyFXDPFIqHiZgyA5q4AL3A8RpfpaFXwKoAZa1X0kknpBx8F2JSh e0+jzMERRkTcfpfIc80nZ5SYhL3AXoxgkBssqQI7ubOopZeCiHdFeqGBbe5yfGHOwyoX mJplzw4ZejyH/8mMTyrKCKOOLzgq4GxPXwLNPji3U9LJzYZl2beQCNVOH5ackeZYkqCQ wOQA== X-Forwarded-Encrypted: i=1; AJvYcCVK0PxCaNJglQ6S0887YZvm2JOATPEUidxxWIfJZW/wnOmfbkY1+dyTECadUur6nNzyfc7AK66g1CakVAW2@lists.postgresql.org X-Gm-Message-State: AOJu0YzqlUi1zZrH8WlifRdRJCi/ovJ5vXY3b8azLIL0MzIxWAiz2NLb UtrZrEGMD0ontLrOvpz7LGzYuFQX2JEKlDk+ucAJQxBSFloe2O+90xHMcFfeDBlXvnIH4OxPCFb RoMYI+fLJ1eCWTiKOwBlUgcYf33euZ6F7euCcZlmc X-Gm-Gg: AY/fxX6a/aIVH3S8xGQHFUnAQPBGELGkZ4qkJkSb1ZTKU2dFuTwUYdNb16e/iqo3xVs tiMcZ/BVR8/DV2pcYSl8Un2/Rge/m0GMQbOcW9wTyA/z935vD9bjPfi3TRYNGYOO5pUPIZMdWM3 CMWP3uLPICygkzfPm9WGEkwPRmbklHS3N/ODpvNBo3HPSEZTdxdNpvGP2mu/NJs07m9MfBzXenf Xwa/L/RDvO7fGBJdT6zz1Rsr7TSofNZWE4CfjJkAIrAV5dHDJN1M9krtZYhDN/rnCDbAWSO09bL BuV1ofyYCSWytGYcCUKcCQIT2jG38utr2TrhhjMiAL1yHnjCDZxyplvqvoZC5SQt6w== X-Received: by 2002:a05:6512:32c5:b0:59b:794e:dfdb with SMTP id 2adb3069b0e04-59baeed626cmr2929489e87.25.1768820031039; Mon, 19 Jan 2026 02:53:51 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Jakub Wartak Date: Mon, 19 Jan 2026 11:53:38 +0100 X-Gm-Features: AZwV_QjoMaN6mQEhajVQxi3YJ4YUb4N_W_4P8fFlW3a4BhnsnKYUEhdtD3iVSSw Message-ID: Subject: Re: pg_plan_advice To: Robert Haas Cc: Lukas Fittl , Jacob Champion , Dian Fay , Matheus Alcantara , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000009f59120648bb815e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009f59120648bb815e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Jan 15, 2026 at 3:41=E2=80=AFPM Robert Haas = wrote: > [..] > > So here's v10. [..] > I'm very appreciative to everyone for all the testing and reports > about 0005; I still do need some substantive code review particularly > of 0001. Hi, 1. With v10 all my minimal TPC-H checks are OK (both with stats/without sta= ts, parallel and non-parallel). 2. I couldn't find any glaring issue during code review of v10-000[124]. Bu= t I have some questions: a) v10-0001 - any example producing such a dummy subplan? (whatever I've tried I cannot come up with one) b) v10-0001 - maybe we could add a comment nearby "dummy" struct member to look on pgpa_plan_walker() on example how to use it, but that's part of v5= and contrib... c) In v10-0004, maybe in pathnodes.h we could use typedef enum rather th= an list of #defines? (see attached) 3. Yes, I could too also repro Jacob's and get the same failure, so it's re= al: TRAP: failed Assert("child_target->ttype =3D=3D PGPA_TARGET_IDENTIFIER")= , File: "../contrib/pg_plan_advice/pgpa_walker.c", Line: 679, PID: 32344 4. Some raw perf numbers on non-assert builds (please ignore +/- 3% jumps), it just hurts in one scenario where oq2 drops like 9% of juice (quite expected, it's n= ot an issue to be, just posting full results) tps oq1 oq2 oq3 oq4 master 41 14745 439 435 master+v10-000[1-4] 42 15055 439 432 master+v10full 41 14734 429 437 master+v10full+loaded 42 15014 442 438 master+v10full+loaded+advice 41 13481 424 439 (same but in percentages) %tps_to_master oq1 oq2 oq3 oq4 master 100 100 100 100 master+v10-000[1-4] 102 102 100 99 master+v10full 100 100 98 100 master+v10full+loaded 102 102 101 101 master+v10full+loaded+advice 100 91 97 101 Some explanation: * oq =3D> my shortcut for Optimizer stress Query (to disambiguate from TPC-H Queries) * master+v10full+loaded - shared_preloaded_libraries was set to have pg_plan_advice * master+v10full+loaded+advice - as above, but with system-wide GUC set to lengthy and irrelevant (as none of the queries used such aliases) JOIN_ORDER(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11) NESTED_LOOP_PLAIN(x2 x3 x4 x5 x6 x7 x8 x9 x10 x11) SEQ_SCAN(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11) NO_GATHER(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11) The idea was to see how that impacts oq1..4 while not using those. So out of curiosity the oq2 on 1 CPU core behavior looks like below: - no advices --> ~1000 TPS - enabled pg_plan_advice.advice to lengthy, but unrelated thing and it gets ~890TPS - in both cases (empty and set) the bottleneck seems to in palloc0, but empty plan_advice: it's more like palloc0() <- newNode() <- create_index_path() <- build_index_paths() with plan_advice set: palloc0() <- newNode() <- create_nestloop_path() = .. - so if anything people should not put something there blindly, but just SE= T and RESET afterwards (unless we get pinning of SQL plan id to advices) as this might have cost in high-TPS scenarios. -- details about suite for benchmarking: SELECT 'CREATE TABLE t' || g || ' (id int primary key, val int)' FROM generate_series(1, 11) g; \gexec -- 1k parts CREATE TABLE tstresspart (id int, val text) PARTITION BY RANGE (id); SELECT 'CREATE TABLE tpart' || g || ' PARTITION OF tstresspart FOR VALUES FROM (' || g*10 || ') TO (' || (g+1)*10 || ')' FROM generate_series(1, 1000) g; \gexec -- oq1, obtakes ~500ms, below GEQO threshold EXPLAIN SELECT * FROM t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 WHERE t1.id =3D t2.id AND t2.id =3D t3.id AND t3.id =3D t4.id AND t4.id =3D t5.id AND t5.id =3D t6.id AND t6.id =3D t7.id AND t7.id =3D t8.id AND t8.id =3D t9.id AND t9.id =3D t10.id AND t10.id =3D t11.id; -- oq2, hit nested subqueries hard EXPLAIN SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 WHERE id IN (SELECT id FROM t3 WHERE id IN (SELECT id FROM t4 WHERE id IN (SELECT id FROM t5 WHERE id IN (SELECT id FROM t6 WHERE id IN (SELECT id FROM t7 WHERE id IN (SELECT id FROM t8 WHERE id IN (SELECT id FROM t9 WHERE id IN (SELECT id FROM t10 WHERE id IN (SELECT id FROM t11)))))))))) OR id IN (SELECT val FROM t1); -- oq3, part stress test, no part pruning EXPLAIN SELECT * FROM tstresspart WHERE id =3D (SELECT (random()*1000)); -- oq4, stress test IN/VALUES perl -e 'print "SELECT * FROM t1 WHERE id IN ("; for(1..40000) { print "$_"; print "," if $_ !=3D 40000 }; print ");"' > oq4.sql -J. --0000000000009f59120648bb815e Content-Type: text/plain; charset="US-ASCII"; name="typedef_enum_pgsscantype.h.txt" Content-Disposition: attachment; filename="typedef_enum_pgsscantype.h.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkl1ob3d0 ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oIGIvc3JjL2luY2x1ZGUv bm9kZXMvcGF0aG5vZGVzLmgKaW5kZXggYzE3NWVlOTViNjguLjc3MjMwNmQ4MjYyIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rl cy9wYXRobm9kZXMuaApAQCAtNjMsMjUgKzYzLDI3IEBACiAgKiBhbGwgb2YgdGhlIG90aGVycywg YnV0IHRoYXQgZG9lc24ndCB3b3JrIGhlcmU6IHVuc2V0dGluZyBQR1NfU0VRU0NBTiwKICAqIGZv ciBpbnN0YW5jZSwgd291bGQgZGlzYWJsZSBib3RoIHBhcnRpYWwgYW5kIG5vbi1wYXJ0aWFsIHNl cXVlbnRpYWwgc2NhbnMuCiAgKi8KLSNkZWZpbmUgUEdTX1NFUVNDQU4JCQkJCTB4MDAwMDAwMDEK LSNkZWZpbmUgUEdTX0lOREVYU0NBTgkJCQkweDAwMDAwMDAyCi0jZGVmaW5lIFBHU19JTkRFWE9O TFlTQ0FOCQkJMHgwMDAwMDAwNAotI2RlZmluZSBQR1NfQklUTUFQU0NBTgkJCQkweDAwMDAwMDA4 Ci0jZGVmaW5lIFBHU19USURTQ0FOCQkJCQkweDAwMDAwMDEwCi0jZGVmaW5lIFBHU19GT1JFSUdO Sk9JTgkJCQkweDAwMDAwMDIwCi0jZGVmaW5lIFBHU19NRVJHRUpPSU5fUExBSU4JCQkweDAwMDAw MDQwCi0jZGVmaW5lIFBHU19NRVJHRUpPSU5fTUFURVJJQUxJWkUJMHgwMDAwMDA4MAotI2RlZmlu ZSBQR1NfTkVTVExPT1BfUExBSU4JCQkweDAwMDAwMTAwCi0jZGVmaW5lIFBHU19ORVNUTE9PUF9N QVRFUklBTElaRQkweDAwMDAwMjAwCi0jZGVmaW5lIFBHU19ORVNUTE9PUF9NRU1PSVpFCQkweDAw MDAwNDAwCi0jZGVmaW5lIFBHU19IQVNISk9JTgkJCQkweDAwMDAwODAwCi0jZGVmaW5lIFBHU19B UFBFTkQJCQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgUEdTX01FUkdFX0FQUEVORAkJCTB4MDAwMDIw MDAKLSNkZWZpbmUgUEdTX0dBVEhFUgkJCQkJMHgwMDAwNDAwMAotI2RlZmluZSBQR1NfR0FUSEVS X01FUkdFCQkJMHgwMDAwODAwMAotI2RlZmluZSBQR1NfQ09OU0lERVJfSU5ERVhPTkxZCQkweDAw MDEwMDAwCi0jZGVmaW5lIFBHU19DT05TSURFUl9QQVJUSVRJT05XSVNFCTB4MDAwMjAwMDAKLSNk ZWZpbmUgUEdTX0NPTlNJREVSX05PTlBBUlRJQUwJCTB4MDAwNDAwMDAKK3R5cGVkZWYgZW51bSB7 CisJUEdTX1NFUVNDQU4JCQkJCT0gMSA8PCAwLAorCVBHU19JTkRFWFNDQU4JCQkJPSAxIDw8IDEs CisJUEdTX0lOREVYT05MWVNDQU4JCQk9IDEgPDwgMiwKKwlQR1NfQklUTUFQU0NBTgkJCQk9IDEg PDwgMywKKwlQR1NfVElEU0NBTgkJCQkJPSAxIDw8IDQsCisJUEdTX0ZPUkVJR05KT0lOCQkJCT0g MSA8PCA1LAorCVBHU19NRVJHRUpPSU5fUExBSU4JCQk9IDEgPDwgNiwKKwlQR1NfTUVSR0VKT0lO X01BVEVSSUFMSVpFCT0gMSA8PCA3LAorCVBHU19ORVNUTE9PUF9QTEFJTgkJCT0gMSA8PCA4LAor CVBHU19ORVNUTE9PUF9NQVRFUklBTElaRQk9IDEgPDwgOSwKKwlQR1NfTkVTVExPT1BfTUVNT0la RQkJPSAxIDw8IDEwLAorCVBHU19IQVNISk9JTgkJCQk9IDEgPDwgMTEsCisJUEdTX0FQUEVORAkJ CQkJPSAxIDw8IDEyLAorCVBHU19NRVJHRV9BUFBFTkQJCQk9IDEgPDwgMTMsCisJUEdTX0dBVEhF UgkJCQkJPSAxIDw8IDE0LAorCVBHU19HQVRIRVJfTUVSR0UJCQk9IDEgPDwgMTUsCisJUEdTX0NP TlNJREVSX0lOREVYT05MWQkJPSAxIDw8IDE2LAorCVBHU19DT05TSURFUl9QQVJUSVRJT05XSVNF CT0gMSA8PCAxNywKKwlQR1NfQ09OU0lERVJfTk9OUEFSVElBTAkJPSAxIDw8IDE4Cit9IFBnc1Nj YW5UeXBlOwogCiAvKgogICogQ29udmVuaWVuY2UgbWFjcm9zIGZvciB1c2VmdWwgY29tYmluYXRp b24gb2YgdGhlIGJpdHMgZGVmaW5lZCBhYm92ZS4K --0000000000009f59120648bb815e--