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 1m6UIO-00068Y-Sz for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Jul 2021 08:43:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1m6UIM-0000Wa-Tn for pgsql-hackers@arkaria.postgresql.org; Thu, 22 Jul 2021 08:43:06 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m6UIM-0000WS-Kw for pgsql-hackers@lists.postgresql.org; Thu, 22 Jul 2021 08:43:06 +0000 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1m6UIK-0007yX-HL for pgsql-hackers@lists.postgresql.org; Thu, 22 Jul 2021 08:43:05 +0000 Received: by mail-wr1-x42d.google.com with SMTP id f9so5006221wrq.11 for ; Thu, 22 Jul 2021 01:43:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aiven.io; s=google; h=from:to:cc:subject:date:message-id:organization:in-reply-to :references:mime-version:content-transfer-encoding; bh=9EG1orWl6C93747K7dV12Bv9jHFvQ91cdmgaAvqLEOY=; b=e3K1Dtjw+AxZKz2fH2dlWK4DMAN30obFbsMlml2mSZRjG/0cTMp3rkccibx/RUBSJm r0TFZpyWvXuE2gkNfv+K72UapWnXqIZ7hK9ol8FVmpa6WZlpf1shErpM0/oTEjjH1tkT s8IVJxGX1nAuKOkCffjmBCmjs5wcM8pwYwXUY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:organization :in-reply-to:references:mime-version:content-transfer-encoding; bh=9EG1orWl6C93747K7dV12Bv9jHFvQ91cdmgaAvqLEOY=; b=YSlgQ0Yo99iV6WRelW6A633A14becDHw0+7BcNPdf8kK60Glc+t1ZAAUlmNYCnP6sV /6Ji+xVzGacI4lqbrM4QskH+LzQzEeED2YhBxwBx5WBLVE2CHetcUQPI5y1w4KDUBuzm VLUtpbePP4kvVAtGvVV/v84x8vJ63nW4Jkn6LMtjjnn0KuqhyniGR8IZAZcVHm4pOUia iF/c3ZMmOIzdfx53pDIf9BZiR76Q9fV1bPYuhTl5hKj3o40v3imu1AQ3V/oRYSNH1xeo zNu7+tp2bBnZklYXLqFmR5PM455joBZwfgAQqrrFHWV4cj0Nwr5/1zTblvVY4drxEQt+ DLRw== X-Gm-Message-State: AOAM532msUD8cTWxvVDUwy2pZbZolFGWjd1hsYzzHrjSj6gL4RxdQ2vi 4Qtub1gnWiC8f2K48WETl+HpIw== X-Google-Smtp-Source: ABdhPJz0wCz31+Rb0r8bQbOCQdi3PTeDF8Mj2KejhqrcJkWq7BpIagd+UyvYWa+Jwk1IelrqNTkJYw== X-Received: by 2002:a05:6000:44:: with SMTP id k4mr46915060wrx.174.1626943383006; Thu, 22 Jul 2021 01:43:03 -0700 (PDT) Received: from aivenronan.localnet (static-176-158-121-96.ftth.abo.bbox.fr. [176.158.121.96]) by smtp.gmail.com with ESMTPSA id z7sm16182369wrt.94.2021.07.22.01.43.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 01:43:02 -0700 (PDT) From: Ronan Dunklau To: David Rowley Cc: PostgreSQL Developers , Ranier Vilela Subject: Re: Add proper planner support for ORDER BY / DISTINCT aggregates Date: Thu, 22 Jul 2021 10:42:49 +0200 Message-ID: <4493999.1py09z8qHF@aivenronan> Organization: aiven In-Reply-To: References: <5137746.gn36MdYUqo@aivenronan> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Le jeudi 22 juillet 2021, 09:38:50 CEST David Rowley a =E9crit : > On Thu, 22 Jul 2021 at 02:01, Ronan Dunklau wrot= e: > > I tested the 0001 patch against both HEAD and my proposed bugfix for > > postgres_fdw. > >=20 > > There is a problem that the ordered aggregate is not pushed down anymor= e. > > The underlying Sort node is correctly pushed down though. > >=20 > > This comes from the fact that postgres_fdw grouping path never contains > > any > > pathkey. Since the cost is fuzzily the same between the pushed-down > > aggregate and the locally performed one, the tie is broken against the > > pathkeys. > I think this might be more down to a lack of any penalty cost for > fetching foreign tuples. Looking at create_foreignscan_path(), I don't > see anything that adds anything to account for fetching the tuples > from the foreign server. If there was something like that then there'd > be more of a preference to perform the remote aggregation so that > fewer rows must arrive from the remote server. >=20 > I tested by adding: total_cost +=3D cpu_tuple_cost * rows * 100; in > create_foreignscan_path() and I got the plan with the remote > aggregation. That's a fairly large penalty of 1.0 per row. Much bigger > than parallel_tuple_cost's default value. >=20 > I'm a bit undecided on how much this patch needs to get involved in > adjusting foreign scan costs. The problem is that we've given the > executor a new path to consider and nobody has done any proper > costings for the foreign scan so that it properly prefers paths that > have to pull fewer foreign tuples. This is a pretty similar problem > to what parallel_tuple_cost aims to fix. Also similar to how we had to > add APPEND_CPU_COST_MULTIPLIER to have partition-wise aggregates > prefer grouping at the partition level rather than at the partitioned > table level. >=20 > > Ideally we would add the group pathkeys to the grouping path, but this > > would add an additional ORDER BY expression matching the GROUP BY. > > Moreover, some triaging of the pathkeys would be necessary since we now > > mix the sort-in- aggref pathkeys with the group_pathkeys. >=20 > I think you're talking about passing pathkeys into > create_foreign_upper_path in add_foreign_grouping_paths. If so, I > don't really see how it would be safe to add pathkeys to the foreign > grouping path. What if the foreign server did a Hash Aggregate? The > rows might come back in any random order. Yes, I was suggesting to add a new path with the pathkeys factored in, whic= h=20 if chosen over the non-ordered path would result in an additional ORDER BY= =20 clause to prevent a HashAggregate. But that doesn't seem a good idea after= =20 all. >=20 > I kinda think that to fix this properly would need a new foreign > server option such as foreign_tuple_cost. I'd feel better about > something like that with some of the people with a vested interest in > the FDW code were watching more closely. So far we've not managed to > entice any of them with the bug report yet, but it's maybe early days > yet. We already have that in the form of fdw_tuple_cost as a server option if I'= m=20 not mistaken ? It works as expected when the number of tuples is notably=20 reduced by the foreign group by. The problem arise when the cardinality of the groups is equal to the input'= s=20 cardinality. I think even in that case we should try to use a remote aggreg= ate=20 since it's a computation that will not happen on the local server. I also=20 think we're more likely to have up to date statistics remotely than the one= s=20 collected locally on the foreign tables, and the estimated number of groups= =20 would be more accurate on the remote side than the local one. =2D-=20 Ronan Dunklau