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 1tux1M-00Epqf-Nq for pgsql-hackers@arkaria.postgresql.org; Wed, 19 Mar 2025 17:16:00 +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 1tux1L-008KVv-B2 for pgsql-hackers@arkaria.postgresql.org; Wed, 19 Mar 2025 17:15:59 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tux1L-008KVn-1I for pgsql-hackers@lists.postgresql.org; Wed, 19 Mar 2025 17:15:59 +0000 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tux1J-003jcp-11 for pgsql-hackers@postgresql.org; Wed, 19 Mar 2025 17:15:58 +0000 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-390f5f48eafso4600138f8f.0 for ; Wed, 19 Mar 2025 10:15:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742404555; x=1743009355; darn=postgresql.org; h=in-reply-to:content-language:references:to:from:subject:user-agent :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=vUUKOGTmoHAoFZY7j+ezaa/FqdRPiZiRBmo2XsiOSfA=; b=G2mOsPP9Eu/fXx/KqSLBg1kA/FT08qTTma/8LR+c35lrZq5Sgs3WeyfS/FisKBvR3A +CaQ8D5gdkhjQAjPzx6I9Lzsa9aGIPY153ybUTihKYs10Vypky1mhNOk4gxol6cAy9QJ Hfn7ous+OS7ylFFzE03DCjTX9bYh+NHT52Nc2wMY+QxZdeIvWbMT/MlxREh1onM07WdF ZJTGiLrdRaeyb+n4JsCAEBMJbFOzyUTDOMbeuq+RR8uVTbU/t6ApNXEFTiaWKg01NDhb hyNeDq8hYhNbMZUc/CM3dytmRSXZoRp2icfnxwVliwcACnLrBYQei0vYGa7Aw2i2aVT+ xZOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742404555; x=1743009355; h=in-reply-to:content-language:references:to:from:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=vUUKOGTmoHAoFZY7j+ezaa/FqdRPiZiRBmo2XsiOSfA=; b=IjGkC/vzrlNViHkWQ2YS6tPXbLhvbLcCiqUmGfrVsmOVSm3cTUywzs64wUA2OR3hJI En51tYxSLXG9FYgN7TOJcrjOIqbDYd9VNZJeMhua820dXf+d8PoY6tH99NZeuKa0iv5g u2G/kugt1CkfTPdeVY0GQHM0jMTpXnrBYpY4VT/uuqMSOgnXI1kbTR5NddInYLXWF4DD Ogzjd2CH4RLvEeEiFhel9vXxz0HlEys/3nvC/M62OL1HDmcG1jmI6u6u0A+kjLlwe/hm atRR2IQsIuVHNC2K290tW75YlK/sXp7IqWAyCmTpexD6HehLvb9g4oiFuYlbq12/rMZf qmSA== X-Gm-Message-State: AOJu0YymmibtcM95VGOkzescBUIXXeWaYYolBKZdZAK4EevkoFiIayTp eZQivdulBby06OvPjP3BYXStOX9tksnq91bO45WRXTDWvhYP8bzLadcVp3nF+zY= X-Gm-Gg: ASbGnctMGX76viI1gfxus6KotSPZ0dZi6a7JX6x4Z3fjNQT/9JEAYk63eFe5XBmwW3F oTdhxbq7ik9mLOpieA12wzWs89ckmVKNvkMJww6riiQ4frHKodpW4w00HOwbxT71YT8MfzHOF+g t36XGR5prQgEWn90sNakffdDDRnzQozm6pd64gXj6IKodnxjoHmsDeryc7b5gBT3sFc/TfS55SR 0L3+WXorYMhslDzkG7Xt5zCvRxyBDQ5hhfNVGK7A830lv+O1qhSwxX3a/6Okk/Kp5BnbRSL7mMZ 0qzoZqEJOQc9PU2Jy0VB3RATv6Wyjd/rEm6G5R3SXyuX4uy7ilOy X-Google-Smtp-Source: AGHT+IG0pzfekNp3FZIsKsXtyCpyir7VRtzpBnJSJp8CeREdsbgLGVxwzTHoYsbWMus+onL+EHln3w== X-Received: by 2002:a05:6000:4412:b0:38f:37f3:5ca9 with SMTP id ffacd0b85a97d-39973b438cfmr1837099f8f.50.1742404555338; Wed, 19 Mar 2025 10:15:55 -0700 (PDT) Received: from [10.59.3.23] ([90.121.90.131]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-395cb40cd78sm21503203f8f.78.2025.03.19.10.15.54 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 19 Mar 2025 10:15:54 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------DjRSRGkh6iApmzN68q7arihX" Message-ID: <95586c5d-2632-4f1c-bfb9-4c391f260de4@gmail.com> Date: Wed, 19 Mar 2025 18:15:54 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Memoize ANTI and SEMI JOIN inner From: Andrei Lepikhov To: PostgreSQL-development References: <60bf8d26-7c7e-4915-b544-afdb9020011d@gmail.com> Content-Language: en-US In-Reply-To: <60bf8d26-7c7e-4915-b544-afdb9020011d@gmail.com> 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. --------------DjRSRGkh6iApmzN68q7arihX Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 6/3/2025 14:08, Andrei Lepikhov wrote: > Hi, > > In case of NestLoop with parameterised inner semi-join for each outer > tuple requires only a single tuple from its inner relation to produce a > result. It seems that the same principle applies to an anti-join. This > approach could effectively allow the Memoize node to enhance the > performance of pulled-up EXISTS and NOT EXISTS sublinks. > > In attachment see a sketch of the feature. Since we are using single_row > mode, adapting this method to cache semi-join inner results should not > be extremely complex. However, I am unsure about potential corner cases > and would appreciate any feedback or criticisms regarding this approach. I found a corner case that breaks this approach: when NestLoop has a join clause or a filter, it may filter inner tuples, thus scanning more than only one time for each outer. You can see the reproduction script in the attachment. Each of the reproduction queries throws the error: ERROR: cache entry already complete How can we be sure that semi or anti-join needs only one tuple? I think it would be enough to control the absence of join clauses and filters in the join. Unfortunately, we only have such a guarantee in the plan creation stage (maybe even setrefs.c). So, it seems we need to invent an approach like AlternativeSubplan. -- regards, Andrei Lepikhov --------------DjRSRGkh6iApmzN68q7arihX Content-Type: application/sql; name="repro.sql" Content-Disposition: attachment; filename="repro.sql" Content-Transfer-Encoding: base64 Q1JFQVRFIFRBQkxFIG1lbV9zZW1pX2lubmVyX2EgKHggaW50KTsKQ1JFQVRFIFRBQkxFIG1l bV9zZW1pX2lubmVyX2IgKHggaW50LCB5IGludCk7CkNSRUFURSBUQUJMRSBtZW1fc2VtaV9p bm5lcl9jICh4IGludCwgeSBpbnQpOwpJTlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9hICh4 KQogIChTRUxFQ1QgdmFsdWUlMiBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDEwKSBBUyB2YWx1 ZSk7CklOU0VSVCBJTlRPIG1lbV9zZW1pX2lubmVyX2IgKHgseSkKICAoU0VMRUNUIHZhbHVl JTUsIC12YWx1ZSU1LTEgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMCkgQVMgdmFsdWUpOwpJ TlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9jICh4LHkpCiAgKFNFTEVDVCB2YWx1ZSU1MCwg dmFsdWUgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDApIEFTIHZhbHVlKTsKQ1JFQVRFIElO REVYIE9OIG1lbV9zZW1pX2lubmVyX2IoeCk7CkNSRUFURSBJTkRFWCBPTiBtZW1fc2VtaV9p bm5lcl9jKHgpOwpWQUNVVU0gQU5BTFlaRSBtZW1fc2VtaV9pbm5lcl9hLG1lbV9zZW1pX2lu bmVyX2IsbWVtX3NlbWlfaW5uZXJfYzsKCi0tIEZvcmNlIE5lc3RMb29wIGFuZCBJbmRleFNj YW4uIEhvcGUsIHRoZSBNZW1vaXplIG5vZGUgd2luIHRoZSBjb3N0Ci0tIGNvbXBldGl0aW9u IG9uIHRoZSBpbm5lciBjIHRhYmxlIHNjYW4uClNFVCBlbmFibGVfaGFzaGpvaW4gPSAnb2Zm JzsKU0VUIGVuYWJsZV9tZXJnZWpvaW4gPSAnb2ZmJzsKU0VUIGVuYWJsZV9zZXFzY2FuID0g J29mZic7CgotLSBUaGUgdGVzdCBuZWVkcyB0aGUgTWVtb2l6ZSBub2RlIG92ZXIgdGhlICJT Y2FuIGMiIG9wZXJhdG9yLgpFWFBMQUlOIChBTkFMWVpFLCBDT1NUUyBPRkYpClNFTEVDVCBh LngsIGIueCBGUk9NIG1lbV9zZW1pX2lubmVyX2EgYQogIExFRlQgSk9JTiBtZW1fc2VtaV9p bm5lcl9iIGIgT04gKGEueD1iLngpCldIRVJFIE5PVCBFWElTVFMgKAogIFNFTEVDVCAxIEZS T00gbWVtX3NlbWlfaW5uZXJfYyBjIFdIRVJFIGMueD1hLnggQU5EIGMueT1iLnkpOwoKLS0g VGhlIHRlc3QgbmVlZHMgdGhlIE1lbW9pemUgbm9kZSBvdmVyIHRoZSAiU2NhbiBjIiBvcGVy YXRvci4KRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGKQpTRUxFQ1QgYS54LCBiLnggRlJP TSBtZW1fc2VtaV9pbm5lcl9hIGEKICBMRUZUIEpPSU4gbWVtX3NlbWlfaW5uZXJfYiBiIE9O IChhLng9Yi54KQpXSEVSRSBFWElTVFMgKAogIFNFTEVDVCAxIEZST00gbWVtX3NlbWlfaW5u ZXJfYyBjIFdIRVJFIGMueD1hLnggQU5EIGMueT1iLnkpOwpEUk9QIFRBQkxFIG1lbV9zZW1p X2lubmVyX2EsbWVtX3NlbWlfaW5uZXJfYixtZW1fc2VtaV9pbm5lcl9jOw== --------------DjRSRGkh6iApmzN68q7arihX--