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 1qrE8S-003Ecz-Os for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Oct 2023 09:07:08 +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 1qrE8Q-00GNiG-K5 for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Oct 2023 09:07:07 +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 1qrE5O-00GIos-Vo for pgsql-hackers@lists.postgresql.org; Fri, 13 Oct 2023 09:03:59 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qrE5M-000JwR-5Y for pgsql-hackers@lists.postgresql.org; Fri, 13 Oct 2023 09:03:59 +0000 Received: from [192.168.1.35] (ppp-124-122-35-87.revip2.asianet.co.th [124.122.35.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 2F0CBE20EA2; Fri, 13 Oct 2023 12:03:54 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1697187836; bh=bWTs0Cze9DuQbrbYiK+sIAdIPn7mjIS79+6ADNacpq0=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=M4WAsyrO+H4qY6Z0o2X/Izpef1DieRRRYTYkHg7jtDPDNXFGcn8nTZvKka4pVNxO5 M8mg5Yku7HUrzqJBYkZ3FjiKQODyqK7dqMkECaXXvQU6fA3G+45prdNtjhkbxG77kx sAMbNg9Sg9YVgOp0NLznveGkjcE04H/RxeUESl156zrIUHp1VjzMrmXEKrmcrio+Iu RkkZezGDHEQ2KPSQ3EY1nyImgVTbZR5lZlUKZnxBGdSFfPS9Fx/WtL/RKhIkSHWZMG 8AbJYQQZRhr73jo3m4ib13hgT7ddaENBRAlHrYlGrK/YTmJ0Rtjdzl8puPrvbA0u5t WVxG4NjsUtESA== Message-ID: Date: Fri, 13 Oct 2023 16:03:50 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Removing unneeded self joins Content-Language: en-US To: "a.rybakina" , Alexander Korotkov Cc: "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=C5=82_K=C5=82eczek?= , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> <20221206184643.zya44h5auv6f45zp@awork3.anarazel.de> <36579124-f9d9-a51e-38b3-af3511921c7e@postgrespro.ru> <88079CBD-B5BB-4C61-A68B-A8C67599E1C7@kleczek.org> <05469e80-454b-41d7-d04f-421f42bbd4a9@postgrespro.ru> <48c11b23-9c23-440e-9a3c-020e05196449@postgrespro.ru> <9eb86ca9-da3c-417f-8ce1-29c0ef5a4f50@postgrespro.ru> <29ddec15-a83f-4f24-b069-6e93c189b169@postgrespro.ru> From: Andrei Lepikhov Organization: Postgres Professional In-Reply-To: <29ddec15-a83f-4f24-b069-6e93c189b169@postgrespro.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 13/10/2023 15:56, a.rybakina wrote: > >>> Also I've incorporated improvements from Alena Rybakina except one for >>> skipping SJ removal when no SJ quals is found.  It's not yet clear for >>> me if this check fix some cases. But at least optimization got skipped >>> in some useful cases (as you can see in regression tests). >> >> Agree. I wouldn't say I like it too. But also, I suggest skipping some >> unnecessary assertions proposed in that patch: >> Assert(toKeep->relid != -1); - quite strange. Why -1? Why not all the >> negative numbers, at least? >> Assert(is_opclause(orinfo->clause)); - above we skip clauses with >> rinfo->mergeopfamilies == NIL. Each mergejoinable clause is already >> checked as is_opclause. >> All these changes (see in the attachment) are optional. >> > I don't mind about asserts, maybe I misunderstood something in the patch. > > About skipping SJ removal when no SJ quals is found, I assume it is > about it: > > split_selfjoin_quals(root, restrictlist, &selfjoinquals, >                                   &otherjoinquals, inner->relid, > outer->relid); > > +            if (list_length(selfjoinquals) == 0) > +             { > +                 /* > +                  * XXX: > +                  * we would detect self-join without quals like 'x==x' > if we had > +                  * an foreign key constraint on some of other quals > and this join > +                  * haven't any columns from the outer in the target list. > +                  * But it is still complex task. > +                  */ > +                 continue; > +             } > > as far as I remember, this is the place where it is checked that the SJ > list is empty and it is logical, in my opinion, that no transformations > should be performed if no elements are found for them. You forget we have "Degenerate" case, as Alexander mentioned above. What if you have something like that: SELECT ... FROM A a1, A a2 WHERE a1.id=1 AND a2.id=1; In this case, uniqueness can be achieved by the baserestrictinfo "A.id=1", if we have an unique index on this column. -- regards, Andrey Lepikhov Postgres Professional