Re: row filtering for logical replication
Dilip Kumar <dilipbalaut@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Release cache tuple when no longer needed
- ed0fbc8e5ac9 15.0 landed
-
Add some additional tests for row filters in logical replication.
- ceb57afd3ce1 15.0 landed
-
Fix one of the tests introduced in commit 52e4f0cd47.
- cfb4e209ec15 15.0 landed
-
Allow specifying row filters for logical replication of tables.
- 52e4f0cd472d 15.0 landed
-
Move scanint8() to numutils.c
- cfc7191dfea3 15.0 cited
-
Replace Test::More plans with done_testing
- 549ec201d613 15.0 cited
-
Reduce relcache access in WAL sender streaming logical changes
- 6ce16088bfed 15.0 cited
-
Small cleanups related to PUBLICATION framework code
- c9105dd3660f 15.0 cited
-
Add a view to show the stats of subscription workers.
- 8d74fc96db5f 15.0 cited
-
Allow publishing the tables of schema.
- 5a2832465fd8 15.0 cited
-
Doc: improve documentation of CREATE/ALTER SUBSCRIPTION.
- 1882d6cca161 15.0 cited
-
Add PublicationTable and PublicationRelInfo structs
- 0c6828fa987b 15.0 cited
-
Remove unused argument "txn" in maybe_send_schema().
- 93d573d86571 15.0 cited
-
Add prepare API support for streaming transactions in logical replication.
- 63cf61cdeb7b 15.0 cited
-
Unify PostgresNode's new() and get_new_node() methods
- 201a76183e20 15.0 cited
-
Use l*_node() family of functions where appropriate
- 2b00db4fb0c7 15.0 cited
-
Add support for prepared transactions to built-in logical replication.
- a8fd13cab0ba 15.0 cited
-
Restore the portal-level snapshot after procedure COMMIT/ROLLBACK.
- ef9480509622 11.13 cited
-
Rename a parse node to be more general
- 91d1f2d30210 14.0 landed
-
Remove unused column atttypmod from initial tablesync query
- 4ad31bb2ef25 14.0 landed
-
SEARCH and CYCLE clauses
- 3696a600e229 14.0 cited
On Tue, Sep 21, 2021 at 10:41 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > If you have only a and c in the old tuple, how will it evaluate > expression c + d? Well, what I told is that if we have such dependency then we will have to copy that field to the old tuple, e.g. if we convert the filter for the old tuple from (a > 10 and b < 20 and c+d = 20) to (a > 10 and c+d=20), then we will not have to copy 'b' to the old tuple but we still have to copy 'd' because there is a dependency. I think the point is if for some expression some > values are in old tuple and others are in new then the idea proposed > in the patch seems sane. Moreover, I think in your idea for each tuple > we might need to build a new expression and sometimes twice that will > beat the purpose of cache we have kept in the patch and I am not sure > if it is less costly. Basically, expression initialization should happen only once in most cases so with my suggestion you might have to do it twice. But the overhead of extra expression evaluation is far less than doing duplicate evaluation because that will happen for sending each update operation right? > See another example where splitting filter might not give desired results: > > Say filter expression: (a = 10 and b = 20 and c = 30) > > Now, old_tuple has values for columns a and c and say values are 10 > and 30. So, the old_tuple will match the filter if we split it as per > your suggestion. Now say new_tuple has values (a = 5, b = 15, c = 25). > In such a situation dividing the filter will give us the result that > the old_tuple is matching but new tuple is not matching which seems > incorrect. I think dividing filter conditions among old and new tuples > might not retain its sanctity. Yeah that is a good example to apply a duplicate filter, basically some filters might not even get evaluated on new tuples as the above example and if we have removed such expression on the other tuple we might break something. Maybe for now this suggest that we might not be able to avoid the duplicate execution of the expression > > > > > > Even if it were done, there would still be the overhead of deforming the tuple. > > > > Suppose filter is just (a > 10 and b < 20) and only if the a is > > updated, and if we are able to modify the filter for the oldtuple to > > be just (a>10) then also do we need to deform? > > > > Without deforming, how will you determine which columns are part of > the old tuple? Okay, then we might have to deform, but at least are we ensuring that once we have deform the tuple for the expression evaluation then we are not doing that again while sending the tuple? -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com