Re: Optimization for updating foreign tables in Postgres FDW

Поиск
Список
Период
Сортировка
От Etsuro Fujita
Тема Re: Optimization for updating foreign tables in Postgres FDW
Дата
Msg-id 5534AD84.3020501@lab.ntt.co.jp
обсуждение исходный текст
Ответ на Re: Optimization for updating foreign tables in Postgres FDW  (Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>)
Ответы Re: Optimization for updating foreign tables in Postgres FDW  (Kyotaro HORIGUCHI <horiguchi.kyotaro@lab.ntt.co.jp>)
Список pgsql-hackers
On 2015/04/17 13:16, Amit Langote wrote:
> On 17-04-2015 PM 12:35, Etsuro Fujita wrote:
>> (2) that might cause the problem of associating subplans' update
>> information with subplans' scan information, pointed out by Tom [1].

> Having realized how it really works now, my +1 to "Foreign Modifying Scan" for
> cases of pushed down update as suggested by Albe Laurenz. I guess it would be
> signaled by the proposed ForeignScan.CmdType being CMD_UPDATE / CMP_UPDATE
> (/CMD_INSERT).

Thanks for the opinion!  I think that that is an idea.  However, I'd
like to propose to rename "Foreign Update" ("Foreign Delete") of
ModifyTable simply to "Update" ("Delete") not only because (1) that
solves the duplication problem but also because (2) ISTM that is
consistent with the non-inherited updates in both of the
non-pushed-down-update case and the pushed-down-update case.  Here are
examples for (2).

* Inherited and non-inherited updates for the non-pushed-down case:

postgres=# explain verbose update parent set c1 = trunc(random() * 9 +
1)::int;                                                QUERY PLAN
-------------------------------------------------------------------------------------------------------------Update on
public.parent (cost=0.00..452.06 rows=5461 width=6)  Update on public.parent  Update on public.ft1    Remote SQL:
UPDATEpublic.t1 SET c1 = $2 WHERE ctid = $1  Update on public.ft2    Remote SQL: UPDATE public.t2 SET c1 = $2 WHERE
ctid= $1  ->  Seq Scan on public.parent  (cost=0.00..0.01 rows=1 width=6)        Output: (trunc(((random() *
'9'::doubleprecision) +
 
'1'::double precision)))::integer, parent.ctid  ->  Foreign Scan on public.ft1  (cost=100.00..226.03 rows=2730 width=6)
      Output: (trunc(((random() * '9'::double precision) +
 
'1'::double precision)))::integer, ft1.ctid        Remote SQL: SELECT ctid FROM public.t1 FOR UPDATE  ->  Foreign Scan
onpublic.ft2  (cost=100.00..226.03 rows=2730 width=6)        Output: (trunc(((random() * '9'::double precision) +
 
'1'::double precision)))::integer, ft2.ctid        Remote SQL: SELECT ctid FROM public.t2 FOR UPDATE
(14 rows)

postgres=# explain verbose update ft1 set c1 = trunc(random() * 9 + 1)::int;
QUERY PLAN
 
------------------------------------------------------------------------------------------------------Update on
public.ft1 (cost=100.00..226.03 rows=2730 width=6)  Remote SQL: UPDATE public.t1 SET c1 = $2 WHERE ctid = $1  ->
ForeignScan on public.ft1  (cost=100.00..226.03 rows=2730 width=6)        Output: (trunc(((random() * '9'::double
precision)+
 
'1'::double precision)))::integer, ctid        Remote SQL: SELECT ctid FROM public.t1 FOR UPDATE
(5 rows)

* Inherited and non-inherited updates for the pushed-down case:

postgres=# explain verbose update parent set c1 = c1 + 1;                                 QUERY PLAN
------------------------------------------------------------------------------Update on public.parent
(cost=0.00..376.59rows=4819 width=10)  Update on public.parent  Update on public.ft1  Update on public.ft2  ->  Seq
Scanon public.parent  (cost=0.00..0.00 rows=1 width=10)        Output: (parent.c1 + 1), parent.ctid  ->  Foreign Update
onpublic.ft1  (cost=100.00..188.29 rows=2409
 
width=10)        Remote SQL: UPDATE public.t1 SET c1 = (c1 + 1)  ->  Foreign Update on public.ft2  (cost=100.00..188.29
rows=2409
width=10)        Remote SQL: UPDATE public.t2 SET c1 = (c1 + 1)
(10 rows)

postgres=# explain verbose update ft1 set c1 = c1 + 1;                                 QUERY PLAN
------------------------------------------------------------------------------Update on public.ft1
(cost=100.00..188.29rows=2409 width=10)  ->  Foreign Update on public.ft1  (cost=100.00..188.29 rows=2409
 
width=10)        Remote SQL: UPDATE public.t1 SET c1 = (c1 + 1)
(3 rows)

Comments are welcome.

Best regards,
Etsuro Fujita



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Jeff Janes
Дата:
Сообщение: Re: optimizing vacuum truncation scans
Следующее
От: Sawada Masahiko
Дата:
Сообщение: Re: Freeze avoidance of very large table.