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.94.2) (envelope-from ) id 1u9ivH-005Zpt-Ii for pgsql-bugs@arkaria.postgresql.org; Tue, 29 Apr 2025 11:14:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1u9ivF-006TtF-GG for pgsql-bugs@arkaria.postgresql.org; Tue, 29 Apr 2025 11:14:46 +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.94.2) (envelope-from ) id 1u9ivF-006Tt7-5h for pgsql-bugs@lists.postgresql.org; Tue, 29 Apr 2025 11:14:46 +0000 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u9ivD-000Ahh-1e for pgsql-bugs@lists.postgresql.org; Tue, 29 Apr 2025 11:14:45 +0000 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-43690d4605dso44318415e9.0 for ; Tue, 29 Apr 2025 04:14:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745925282; x=1746530082; darn=lists.postgresql.org; h=subject:from:content-language:to:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=foxCUwOq0rBnikqprK6JfQgq8vgghMha688QzmFNvBI=; b=AbujEnrCKnnSyuVAPCjOWY1HZFN8Kc3cZpDfbwov4/g0G6oqAUg6w8KdRVsjvDJfRo ZJqkbxHqZQFiPm7oOm2Bl7sHv1nuHOyJTwOtL1eU+UcMHFdVqPKx83BhwiyfVi5yJRcc h9xQ+SmHDPUNnlOrkWv/evGbLjnjTZVwgEytnsmg2wy0gkufqjKSYYl3KbJJurTnE3Nb nfQXIsy4opRsiN7k/4pm4yRAud5mWj/mr/5vcDq7Qplw53dViFakjUjvt9GN5999FDgL DldMij/88IU/pzsSlOaQWfxv5AZp2CcDfob0TJe9//S7K58x14JNWViIvzPHgbl/75ym 55jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745925282; x=1746530082; h=subject:from:content-language:to:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=foxCUwOq0rBnikqprK6JfQgq8vgghMha688QzmFNvBI=; b=EtdHkfmhfHZoEsFwUZOLIb3jTvObQwapAJmFQtirajSl9wksZv15yCFAb7DRTJKqBy TpPAv0T7vOsxIg2VoG+TBunWQND1UbguJfwWGnWVaQ33I/XNz8tt38j3C5QFx6X0RuSt et9rreikTiXzvZUhiKFUhTZ5mPramEhZZpLS6cpPpka2UavmlWcc/WACgdKzTzGCIAbB Dj/zrRGllpKQ9mKoqKfbyhfL8dGYZY2bFOMFzpYXFwfyQDIICavLLUyjEch+Eahx2nQa cU1a0A+N0bbDw/tzbT0GrlW6ip2Sz8SNzZ+jahOSwYIZwMj2VXlfNn14pSqfIGV4Mw/N audw== X-Gm-Message-State: AOJu0Yx20/LapaGTiIbDsl/xUSgtPwmUFry0qX+HnMR1OTaebKI18x56 bdrAaZk6iEx2erpFfEfzN4NS51rk/LHoK8H8AmFuFA2LwSMvM37Xi/Y4sHhIrZc= X-Gm-Gg: ASbGncsXNeQxsim8kBLrnLcFs55JLD7GOmf8/rGl94h3RtN//jOQ0br3V/6OD1iet1l WeoaF1Whvewbw2SeolqWNx3nPWTzCW5VfxICPyhwOLAVGJOLHUVYr92V1Vi2U5ybq4iMVrvdtbO YzPEtLJ/95E0zIStMtdJ96yydFx6M48Lh5rgjwWVmy6R6NZxiCc2x7UEy+euMmQstcJ1OdqFD+8 1Yo13TouWXwlySrIFTAWr5tUI5ZQfbfUhinvyV/YtR4oKrQb1yC1BbcLIPRBFyTr/nbiAkEcohg dN1gN4/8QLiurwDZrEFr+dcw4IDqbcAbANXom8XiWj9Wky91Th9v0CXF3Ukmq1TPl9L4Jr6h8Cs = X-Google-Smtp-Source: AGHT+IFItXHObt/k6EXlkUsJXonRO7vxjOHH3IxgUlHsCZRv0LpRggWa5pwvzc/1ZrIa7K0ikNk/oQ== X-Received: by 2002:a05:600c:1d06:b0:43d:10c:2f60 with SMTP id 5b1f17b1804b1-440ab845ea3mr83455955e9.24.1745925281518; Tue, 29 Apr 2025 04:14:41 -0700 (PDT) Received: from [192.168.0.89] (84.123.234.224.dyn.user.ono.com. [84.123.234.224]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4409d2ac27dsm187064225e9.22.2025.04.29.04.14.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 29 Apr 2025 04:14:40 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------tZ5X81QhmMorhWosVkpeESGj" Message-ID: <3ca271fa-ca5c-458c-8934-eb148622b270@gmail.com> Date: Tue, 29 Apr 2025 13:14:39 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: "pgsql-bugs@lists.postgresql.org" , Tomas Vondra Content-Language: en-AU From: Andrei Lepikhov Subject: Incorrect calculation of path fraction value in MergeAppend List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------tZ5X81QhmMorhWosVkpeESGj Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Commit 6b94e7a has added a "fractional" strategy to the merge join path search scope. But as I see it incorrectly calculates tuple_fraction value. Let's see one of the regression tests' queries: EXPLAIN (COSTS OFF) SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY x.id DESC LIMIT 10; It uses NestedLoop with parameterised inner scan as a subplan of MergeAppend. Overall cost is: Limit (cost=1.11..4.86 rows=10 width=16) Let's reduce the LIMIT a little: EXPLAIN (COSTS OFF) SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY x.id DESC LIMIT 2; There, the query plan uses plain NestLoop node and overall cost significantly increases: Limit (cost=0.56..30.70 rows=2 width=16) The origin problem lies in the following code line: path_fraction = (1.0 / root->tuple_fraction); Building startup, total and fractional MergeAppends, the optimiser puts off the 'fractional' way because it has built for a 50% limit (uses MergeJoin with high startup cost) and chooses a startup-optimal path (built upon plain NestLoops) that is better than the total one. Instead, the path_fraction value must be corrected when root->tuple_fraction contains the absolute value of tuples. See the patch in the attachment. I report this issue into the bugs mailing list because it might cause some 'enigmatic' performance slowdowns I have heard about (but have no proofs) and may need back-patching. -- regards, Andrei Lepikhov --------------tZ5X81QhmMorhWosVkpeESGj Content-Type: text/x-patch; charset=UTF-8; name="v0-0001-Fix-tuple_fraction-calculation-for-merge-append-f.patch" Content-Disposition: attachment; filename*0="v0-0001-Fix-tuple_fraction-calculation-for-merge-append-f.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1YWJjYWU5MzdmM2I5ZTljYzVlYTEwNzIxY2UwZDBhNjFmOTE3ZTg0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFR1ZSwgMjkgQXByIDIwMjUgMTI6NTQ6NTkgKzAyMDAKU3ViamVj dDogW1BBVENIIHYwXSBGaXggdHVwbGVfZnJhY3Rpb24gY2FsY3VsYXRpb24gZm9yIG1lcmdl IGFwcGVuZCBmcmFjdGlvbmFsCiBwYXRoCgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2FsbHBhdGhzLmMgICAgICAgIHwgIDYgKysrKystCiBzcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3BhcnRpdGlvbl9qb2luLm91dCB8IDE4ICsrKysrKysrKysrKysrKysrKwogc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX2pvaW4uc3FsICAgICAgfCAgMyArKysKIDMg ZmlsZXMgY2hhbmdlZCwgMjYgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2FsbHBhdGhzLmMgYi9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGF0aC9hbGxwYXRocy5jCmluZGV4IDkwNTI1MGIzMzI1Li41NDM1 NTBhOTM3OCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvYWxscGF0 aHMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9hbGxwYXRocy5jCkBAIC0x ODkxLDcgKzE4OTEsMTEgQEAgZ2VuZXJhdGVfb3JkZXJlZGFwcGVuZF9wYXRocyhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJICovCiAJCQlpZiAocm9vdC0+dHVw bGVfZnJhY3Rpb24gPiAwKQogCQkJewotCQkJCWRvdWJsZQkJcGF0aF9mcmFjdGlvbiA9ICgx LjAgLyByb290LT50dXBsZV9mcmFjdGlvbik7CisJCQkJZG91YmxlCQlwYXRoX2ZyYWN0aW9u ID0gcm9vdC0+dHVwbGVfZnJhY3Rpb247CisKKwkJCQkvKiBDb252ZXJ0IGFic29sdXRlIGxp bWl0IHRvIGEgcGF0aCBmcmFjdGlvbiAqLworCQkJCWlmIChwYXRoX2ZyYWN0aW9uID49IDEu KQorCQkJCQlwYXRoX2ZyYWN0aW9uIC89IGNoaWxkcmVsLT5yb3dzOwogCiAJCQkJY2hlYXBl c3RfZnJhY3Rpb25hbCA9CiAJCQkJCWdldF9jaGVhcGVzdF9mcmFjdGlvbmFsX3BhdGhfZm9y X3BhdGhrZXlzKGNoaWxkcmVsLT5wYXRobGlzdCwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9wYXJ0aXRpb25fam9pbi5vdXQKaW5kZXggNjEwMWM4YzdjZjEuLmQ1MzY4MTg2 Y2FhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9q b2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9qb2lu Lm91dApAQCAtNTI2MCw2ICs1MjYwLDI0IEBAIFNFTEVDVCB4LmlkLCB5LmlkIEZST00gZnJh Y3RfdCB4IExFRlQgSk9JTiBmcmFjdF90IHkgVVNJTkcgKGlkKSBPUkRFUiBCWSB4LmlkIERF CiAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSB4XzIuaWQpCiAoMTEg cm93cykKIAorRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBTaG91bGQgdXNlIE5lc3RMb29wIHdp dGggcGFyYW1ldGVyaXNlZCBpbm5lciBzY2FuCitTRUxFQ1QgeC5pZCwgeS5pZCBGUk9NIGZy YWN0X3QgeCBMRUZUIEpPSU4gZnJhY3RfdCB5IFVTSU5HIChpZCkKK09SREVSIEJZIHguaWQg REVTQyBMSU1JVCAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTGltaXQKKyAgIC0+ICBNZXJnZSBBcHBlbmQKKyAgICAgICAg IFNvcnQgS2V5OiB4LmlkIERFU0MKKyAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpv aW4KKyAgICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gQmFja3dhcmQgdXNpbmcg ZnJhY3RfdDBfcGtleSBvbiBmcmFjdF90MCB4XzEKKyAgICAgICAgICAgICAgIC0+ICBJbmRl eCBPbmx5IFNjYW4gdXNpbmcgZnJhY3RfdDBfcGtleSBvbiBmcmFjdF90MCB5XzEKKyAgICAg ICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHhfMS5pZCkKKyAgICAgICAgIC0+ ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5 IFNjYW4gQmFja3dhcmQgdXNpbmcgZnJhY3RfdDFfcGtleSBvbiBmcmFjdF90MSB4XzIKKyAg ICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgZnJhY3RfdDFfcGtleSBv biBmcmFjdF90MSB5XzIKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9 IHhfMi5pZCkKKygxMSByb3dzKQorCiAtLQogLS0gVGVzdCBBcHBlbmQncyBmcmFjdGlvbmFs IHBhdGhzCiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9u X2pvaW4uc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX2pvaW4uc3FsCmlu ZGV4IGI3NmM1NDUxMDAxLi4zMGYxNWVlOWFjYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvcGFydGl0aW9uX2pvaW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L3BhcnRpdGlvbl9qb2luLnNxbApAQCAtMTIyNCw2ICsxMjI0LDkgQEAgU0VMRUNUIHguaWQs IHkuaWQgRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZyYWN0X3QgeSBVU0lORyAoaWQpIE9S REVSIEJZIHguaWQgQVMKIAogRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNUIHguaWQsIHku aWQgRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZyYWN0X3QgeSBVU0lORyAoaWQpIE9SREVS IEJZIHguaWQgREVTQyBMSU1JVCAxMDsKK0VYUExBSU4gKENPU1RTIE9GRikgLS0gU2hvdWxk IHVzZSBOZXN0TG9vcCB3aXRoIHBhcmFtZXRlcmlzZWQgaW5uZXIgc2NhbgorU0VMRUNUIHgu aWQsIHkuaWQgRlJPTSBmcmFjdF90IHggTEVGVCBKT0lOIGZyYWN0X3QgeSBVU0lORyAoaWQp CitPUkRFUiBCWSB4LmlkIERFU0MgTElNSVQgMjsKIAogLS0KIC0tIFRlc3QgQXBwZW5kJ3Mg ZnJhY3Rpb25hbCBwYXRocwotLSAKMi4zOS41Cgo= --------------tZ5X81QhmMorhWosVkpeESGj--