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 1naBF2-00042d-86 for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Apr 2022 06:58:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1naBF0-0004yc-DD for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Apr 2022 06:58:38 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1naBF0-0004yT-1S for pgsql-hackers@lists.postgresql.org; Fri, 01 Apr 2022 06:58:38 +0000 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1naBEt-0006B7-JI for pgsql-hackers@postgresql.org; Fri, 01 Apr 2022 06:58:37 +0000 Received: by mail-ej1-x62f.google.com with SMTP id bg10so3882039ejb.4 for ; Thu, 31 Mar 2022 23:58:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=vpcV9YAQq4Kw6Coq7yHK7DrqgR4KOwNOTpHXcavUshM=; b=d+ZEz53vvwNQ6GQsAUSJi1fIOteqW+dx72Mytn0/kU02i9g3B2lBZw85Q5ybdFWB7k g8LKfJZXVYEMj3FvaUEjuD9jy3m0PUMMY2UcoRlezmLc5NJSQkKJCZ8UbijJQ9xGSvKK tuRibWGyeo7P02sNcKuwB2GUBT86CsXFUN3oIQIU513hKaOql/bq7N6tvA2MPYyiGkwZ JsvUV6ur/OPPktd7aRbUmqFLx47HvVT3y2tdB8qskehrO4qrGPKBdFw9P8bdmH3i7d75 mLaJtvA3tQQ/0JDis5HGBuA0zC0V91AQNwlu/zYd36hgFs/XWvZJ1Ex7QyDm/BrOocA0 jGdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=vpcV9YAQq4Kw6Coq7yHK7DrqgR4KOwNOTpHXcavUshM=; b=QkcZOdfmXKSnDyFLCj0GKMQDiVnJQruefYEhBHAEQnA75fAWYMVCo12wNfdA6s43MJ BLIE8L9tZl9q/N+L4QDXBgsxTrQVptrLYBqar1UXZ8jtXP97q7bhTaq60u1aSAMMVVXz dHL6hKN980+cp+0u1WSGhghq19wIrtWWiETpBBJwoJdCu/QeyX1fAWOeXLFEAHqdYI1n umwarXIB+7jJn4w2jzA3STYUhRA34xQQdimZDTTa4vfs3pY1llmL0+MCH1kINI8xI2So k6/YmL3uvhWORpa3M0Avc8U050kkXJoIU58/17C8B2AX/SfyUhIRUMolUTR71jWtkvYL zkGA== X-Gm-Message-State: AOAM530uIcPqs0r5k6zGpVuxRkfsw+ufj/A5RO48n5Dh93pzYujg550Y 3I4e7Qe9s6W9cKiUkxJypJbsX2G3dIfeNHHcbI4= X-Google-Smtp-Source: ABdhPJxiVt0TiwyKTEHGKod14EBor9QKfx27q8gYidKympGQ1dCUcbH6qsmChjEQZix0wiDOZxa7/8zRXDuiMISwwio= X-Received: by 2002:a17:906:4785:b0:6df:6784:a7f8 with SMTP id cw5-20020a170906478500b006df6784a7f8mr8471405ejc.301.1648796309939; Thu, 31 Mar 2022 23:58:29 -0700 (PDT) MIME-Version: 1.0 References: <215356.1647286703@sss.pgh.pa.us> In-Reply-To: From: Amit Langote Date: Fri, 1 Apr 2022 15:58:13 +0900 Message-ID: Subject: Re: generic plans and "initial" pruning To: David Rowley Cc: Robert Haas , Tom Lane , PostgreSQL-development Content-Type: text/plain; charset="UTF-8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Fri, Apr 1, 2022 at 1:08 PM David Rowley wrote: > On Fri, 1 Apr 2022 at 16:09, Amit Langote wrote: > > definition of PlannedStmt says this: > > > > /* ---------------- > > * PlannedStmt node > > * > > * The output of the planner > > > > With the ideas that you've outlined below, perhaps we can frame most > > of the things that the patch wants to do as the planner and the > > plancache changes. If we twist the above definition a bit to say what > > the plancache does in this regard is part of planning, maybe it makes > > sense to add the initial pruning related fields (nodes, outputs) into > > PlannedStmt. > > How about the PartitionPruneInfos go into PlannedStmt as a List > indexed in the way I mentioned and the cache of the results of pruning > in EState? > > I think that leaves you adding List *partpruneinfos, Bitmapset > *minimumlockrtis to PlannedStmt and the thing you have to cache the > pruning results into EState. I'm not very clear on where you should > stash the results of run-time pruning in the meantime before you can > put them in EState. You might need to invent some intermediate struct > that gets passed around that you can scribble down some details you're > going to need during execution. Yes, the ExecLockRelsInfo node in the current patch, that first gets added to the QueryDesc and subsequently to the EState of the query, serves as that stashing place. Not sure if you've looked at ExecLockRelInfo in detail in your review of the patch so far, but it carries the initial pruning result in what are called PlanInitPruningOutput nodes, which are stored in a list in ExecLockRelsInfo and their offsets in the list are in turn stored in an adjacent array that contains an element for every plan node in the tree. If we go with a PlannedStmt.partpruneinfos list, then maybe we don't need to have that array, because the Append/MergeAppend nodes would be carrying those offsets by themselves. Maybe a different name for ExecLockRelsInfo would be better? Also, given Tom's apparent dislike for carrying that in PlannedStmt, maybe the way I have it now is fine? > > One question is whether the planner should always pay the overhead of > > initializing this bitmapset? I mean it's only worthwhile if > > AcquireExecutorLocks() is going to be involved, that is, the plan will > > be cached and reused. > > Maybe the Bitmapset for the minimal locks needs to be built with > bms_add_range(NULL, 0, list_length(rtable)); then do > bms_del_members() on the relevant RTIs you find in the listed > PartitionPruneInfos. That way it's very simple and cheap to do when > there are no PartitionPruneInfos. Ah, okay. Looking at make_partition_pruneinfo(), I think I see a way to delete the RTIs of prunable relations -- construct a all_matched_leaf_part_relids in parallel to allmatchedsubplans and delete those from the initial set. > > > 4. It's a bit disappointing to see RelOptInfo.partitioned_rels getting > > > revived here. Why don't you just add a partitioned_relids to > > > PartitionPruneInfo and just have make_partitionedrel_pruneinfo build > > > you a Relids of them. PartitionedRelPruneInfo already has an rtindex > > > field, so you just need to bms_add_member whatever that rtindex is. > > > > Hmm, not all Append/MergeAppend nodes in the plan tree may have > > make_partition_pruneinfo() called on them though. > > For Append/MergeAppends without run-time pruning you'll want to add > the RTIs to the minimal locking set of RTIs to go into PlannedStmt. > The only things you want to leave out of that are RTIs for the RTEs > that you might run-time prune away during AcquireExecutorLocks(). Yeah, I see it now. Thanks. -- Amit Langote EDB: http://www.enterprisedb.com