Re: Differential (transactional) REFRESH - Mailing list pgsql-hackers

From Kevin Grittner
Subject Re: Differential (transactional) REFRESH
Date
Msg-id 1368561893.56557.YahooMailNeo@web162902.mail.bf1.yahoo.com
Whole thread Raw
In response to Re: Differential (transactional) REFRESH  (Thom Brown <thom@linux.com>)
Responses Re: Differential (transactional) REFRESH  (Thom Brown <thom@linux.com>)
List pgsql-hackers
<div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt">Thom
Brown<thom@linux.com> wrote:<br />> On 14 May 2013 19:51, Kevin Grittner <kgrittn@ymail.com> wrote:<br
/>>>In the first CF for 9.4 I plan to submit a patch to allow<br />>> transactional REFRESH of a
materializedview using differential<br />>> update.  Essentially I expect this to be the equivalent of running<br
/>>>the query specified for the view and saving the results into a<br />>> temporary table, and then doing
DELETEand INSERT passes to make<br />>> the matview match the new data.  If mv is the matview and mv_temp<br
/>>>is the temporary storage for the new value for its data, the logic<br />>> would be roughly the
equivalentof:<br />>><br />>> BEGIN;<br />>> LOCK mv IN SHARE ROW EXCLUSIVE MODE;<br />>>
CREATETEMP TABLE mv_temp AS [mv query];<br />>> -- Create indexes here???  Capture statistics on temp table???<br
/>>>DELETE FROM mv WHERE NOT EXISTS (SELECT * FROM mv_temp<br />>>  WHERE (mv_temp.*) IS NOT DISTINCT FROM
(mv.*));<br/>>> INSERT INTO mv SELECT * FROM mv_temp WHERE NOT EXISTS<br />>>  (SELECT * FROM mv WHERE
(mv.*)IS NOT DISTINCT FROM (mv_temp.*));<br />>> COMMIT;<br />> <br />> Wouldn't this either delete
everythingor nothing, followed by<br />> inserting everything or nothing?  WHERE NOT EXISTS wouldn't perform<br
/>>any matching, just check to see whether there were matches or no<br />> matches.<br /><br />No.<br /><br
/>test=#-- Mock up the matview and the generated temp replacement in regular tables<br />test=# -- for purposes of
demonstration.<br/>test=# create table mv (id int not null primary key, val text);<br />CREATE TABLE<br />test=# insert
intomv values (1, 'one'), (2, 'two'), (3, null), (4, 'four');<br />INSERT 0 4<br />test=# create temp table mv_temp as
select* from mv;<br />SELECT 4<br />test=# update mv_temp set val = null where id = 4;<br />UPDATE 1<br />test=# update
mv_tempset val = 'zwei' where id = 2;<br />UPDATE 1<br />test=# delete from mv_temp where id = 1;<br />DELETE 1<br
/>test=#insert into mv_temp values (5, 'five');<br />INSERT 0 1<br />test=# -- Show both.<br />test=# select * from mv
orderby id;<br /> id | val  <br />----+------<br />  1 | one<br />  2 | two<br />  3 |<br />  4 | four<br />(4 rows)<br
/><br/>test=# select * from mv_temp order by id;<br /> id | val  <br />----+------<br />  2 | zwei<br />  3 |<br />  4
|<br/>  5 | five<br />(4 rows)<br /><br />test=# -- Perform the differential update's delete.<br />test=# delete from
mvwhere not exists (select * from mv_temp<br />test(#    where (mv_temp.*) is not distinct from (mv.*));<br />DELETE
3<br/>test=# -- Show both.<br />test=# select * from mv order by id;<br /> id | val<br />----+-----<br />  3 |<br />(1
row)<br/><br />test=# select * from mv_temp order by id;<br /> id | val  <br />----+------<br />  2 | zwei<br />  3
|<br/>  4 |<br />  5 | five<br />(4 rows)<br /><br />test=# -- Perform the differential update's insert.<br />test=#
insertinto mv select * from mv_temp where not exists<br />test-#   (select * from mv where (mv.*) is not distinct from
(mv_temp.*));<br/>INSERT 0 3<br />test=# -- Show both.<br />test=# select * from mv order by id;<br /> id | val  <br
/>----+------<br/>  2 | zwei<br />  3 |<br />  4 |<br />  5 | five<br />(4 rows)<br /><br />test=# select * from
mv_temporder by id;<br /> id | val  <br />----+------<br />  2 | zwei<br />  3 |<br />  4 |<br />  5 | five<br />(4
rows)<br/><br />--<br />Kevin Grittner<br />EnterpriseDB: http://www.enterprisedb.com<br />The Enterprise PostgreSQL
Company<br/><br /></div> 

pgsql-hackers by date:

Previous
From: Thom Brown
Date:
Subject: Re: Differential (transactional) REFRESH
Next
From: Thom Brown
Date:
Subject: Re: Differential (transactional) REFRESH