Hello

2012/5/18 Miroslav Šimulčík <simulcik.m...@gmail.com>:
> Hello.
>
> SQL 2011 standard wasn't available in time I started this project so I built
> my implementation on older standards TSQL2 and SQL/Temporal, that were only
> available. None of these were accepted by ANSI/ISO commissions however.
>
> There is different syntax in SQL 2011 and it looks like one that IBM DB2 had
> been using even before this standard were published.
>
> So my implementation differs in syntax, but features are same as stated in
> "system versioned tables" part of slideshow.
>

I would to see temporal functionality in pg, but only in SQL 2011
syntax. Using syntax from deprecated proposals has no sense. I am not
sure so history table concept is best from performance view - it is
simpler for implementation, but you duplicate all indexes - there will
be lot of redundant fields in history table. A important query is
difference in cost for some non trivial query for actual data and same
query for historic data.

Regards

Pavel Stehule

> Regards
> Miroslav Simulcik
>
>
> 2012/5/17 Pavel Stehule <pavel.steh...@gmail.com>
>>
>> Hello
>>
>> what is conformance of your solution with temporal extension in ANSI SQL
>> 2011
>>
>>
>> http://www.slideshare.net/CraigBaumunk/temporal-extensions-tosql20112012010438
>>
>> Regards
>>
>> Pavel Stehule
>>
>> 2012/5/16 Miroslav Šimulčík <simulcik.m...@gmail.com>:
>> > Hi all,
>> >
>> > as a part of my master's thesis I have created temporal support patch
>> > for
>> > PostgreSQL. It enables the creation of special temporal tables with
>> > entries
>> > versioning. Modifying operations (UPDATE, DELETE, TRUNCATE) on these
>> > tables
>> > don't cause permanent changes to entries, but create new versions of
>> > them.
>> > Thus user can easily get to the past states of the table.
>> >
>> > Basic information on temporal databases can be found
>> > on http://en.wikipedia.org/wiki/Temporal_database
>> >
>> > In field of temporal databases, there are only proprietary solution
>> > available. During the analysis I found these:
>> >     - IBM DB2 10 for z/OS
>> >     - Oracle 11g Workspace Manager
>> >     - Teradata Database 13.10
>> >
>> > Primary goal of my work was the creation of opensource solution, that is
>> > easy to use and is backward compatible with existing applications,
>> > so that
>> > the change of the original tables to temporal ones, does not require
>> > changes
>> > to applications that work with them. This patch is built on standard
>> > SQL/Temporal with some minor modifications inspired by commercial
>> > temporal
>> > database systems. Currently it only deals with transaction time support.
>> >
>> > Here is simple description on how it works:
>> >
>> > 1. user can create transaction time table using modified CREATE TABLE
>> > command:
>> >
>> >     CREATE TABLE person(name varchar(50)) AS TRANSACTIONTIME;
>> >
>> >     This command automatically creates all objects required for
>> > transaction
>> > time support:
>> >
>> >                   List of relations
>> >       Schema |         Name         |   Type   |  Owner
>> >      --------+----------------------+----------+----------
>> >       public | person               | table    | tester
>> >       public | person__entry_id_seq | sequence | tester
>> >       public | person_hist          | table    | postgres
>> >
>> >
>> >                                                   Table "public.person"
>> >         Column   |            Type             |
>> >      Modifiers
>> >
>> >
>> >    ------------+-----------------------------+------------------------------------------------------------------------------
>> >       name       | character varying(50)       |
>> >       _entry_id  | bigint                      | not null default
>> > nextval('person__entry_id_seq'::regclass)
>> >       _sys_start | timestamp without time zone | not null default
>> > clock_timestamp()
>> >       _sys_end   | timestamp without time zone | not null default
>> > '294276-12-31 23:59:59.999999'::timestamp without time zone
>> >      Indexes:
>> >          "person__entry_id_idx" btree (_entry_id)
>> >          "person__sys_start__sys_end_idx" btree (_sys_start, _sys_end)
>> >
>> >
>> >               Table "public.person_hist"
>> >         Column   |            Type             | Modifiers
>> >      ------------+-----------------------------+-----------
>> >       name       | character varying(50)       |
>> >       _entry_id  | bigint                      | not null
>> >       _sys_start | timestamp without time zone | not null
>> >       _sys_end   | timestamp without time zone | not null
>> >      Indexes:
>> >          "person_hist__entry_id_idx" btree (_entry_id)
>> >          "person_hist__sys_start__sys_end_idx" btree (_sys_start,
>> > _sys_end)
>> >
>> >
>> >
>> >
>> >     Table person stores current versions of entries. 3 additional
>> > columns
>> > are added:
>> >         _entry_id - id of entry. It groups together different versions
>> > of
>> > entry.
>> >         _sys_start - beginning of the version validity period (version
>> > creation timestamp).
>> >         _sys_end - end of the version validity period.
>> >
>> >     Table person_hist stores historical versions of entries. It has the
>> > same
>> > structure and indexes as the person table, but without any constraints
>> > and
>> > default values.
>> >
>> > 2. another way of creating transaction time table is adding transaction
>> > time
>> > support to existing standard table using ALTER command.
>> >
>> >     CREATE TABLE person(name varchar(50));
>> >     ALTER TABLE person ADD TRANSACTIONTIME;
>> >
>> > 3. INSERT entry
>> >
>> >     INSERT INTO person VALUES('Jack');
>> >
>> >     SELECT *, _entry_id, _sys_start, _sys_end FROM person;
>> >
>> >      name | _entry_id |         _sys_start         |           _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+------------------------------
>> >      Jack |         1 | 2012-05-16 22:11:39.856916 | 294276-12-31
>> > 23:59:59.999999
>> >
>> > 4. UPDATE entry
>> >
>> >     UPDATE person SET name = 'Tom';
>> >
>> >     SELECT *, _entry_id, _sys_start, _sys_end FROM person;
>> >
>> >      name | _entry_id |         _sys_start         |           _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+------------------------------
>> >      Tom  |         1 | 2012-05-16 22:11:44.736195 | 294276-12-31
>> > 23:59:59.999999
>> >
>> >     SELECT * FROM person_hist;
>> >
>> >      name | _entry_id |         _sys_start         |          _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+----------------------------
>> >      Jack |         1 | 2012-05-16 22:11:39.856916 | 2012-05-16
>> > 22:11:44.736194
>> >
>> > 5. DELETE entry
>> >
>> >     DELETE FROM person;
>> >
>> >     SELECT *, _entry_id, _sys_start, _sys_end FROM person;
>> >
>> >      name | _entry_id | _sys_start | _sys_end
>> >     ------+-----------+------------+----------
>> >
>> >     SELECT * FROM person_hist;
>> >
>> >      name | _entry_id |         _sys_start         |          _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+----------------------------
>> >      Jack |         1 | 2012-05-16 22:11:39.856916 | 2012-05-16
>> > 22:11:44.736194
>> >      Tom  |         1 | 2012-05-16 22:11:44.736195 | 2012-05-16
>> > 22:14:33.875869
>> >
>> > 6. selecting entries
>> >
>> >     INSERT INTO person VALUES('Mike');
>> >     INSERT INTO person VALUES('Mike');
>> >
>> >     --standard SELECT - operates only with current versions of entries
>> >     SELECT * FROM person;
>> >
>> >      name
>> >     ------
>> >      Mike
>> >      Mike
>> >
>> >     --special temporal SELECT which operates with all versions
>> >     NONSEQUENCED TRANSACTIONTIME SELECT *, _entry_id, _sys_start,
>> > _sys_end
>> > FROM person;
>> >
>> >      name | _entry_id |         _sys_start         |           _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+------------------------------
>> >      Mike |         3 | 2012-05-16 22:20:55.055671 | 294276-12-31
>> > 23:59:59.999999
>> >      Mike |         2 | 2012-05-16 22:20:51.619475 | 294276-12-31
>> > 23:59:59.999999
>> >      Jack |         1 | 2012-05-16 22:11:39.856916 | 2012-05-16
>> > 22:11:44.736194
>> >      Tom  |         1 | 2012-05-16 22:11:44.736195 | 2012-05-16
>> > 22:14:33.875869
>> >
>> >     --special temporal SELECT which operates with versions valid in
>> > specified time
>> >     TRANSACTIONTIME AS OF '2012-05-16 22:11:39.856916' SELECT *,
>> > _entry_id,
>> > _sys_start, _sys_end FROM person;
>> >
>> >      name | _entry_id |         _sys_start         |          _sys_end
>> >
>> >
>> > ------+-----------+----------------------------+----------------------------
>> >      Jack |         1 | 2012-05-16 22:11:39.856916 | 2012-05-16
>> > 22:11:44.736194
>> >
>> >     --it is also possible to set timestamp globally for session. All
>> > subsequent SELECTs without any temporal modifier will operate
>> > with versions
>> > valid in this time,
>> >     SET history_timestamp TO '2012-05-16 22:11:39.856916';
>> >
>> >     SELECT * FROM person;
>> >
>> >      name
>> >     ------
>> >      Jack
>> >
>> >     --to select only current versions when history_tiumestamp is set,
>> > CURRENT TRANSACTIONTIME have to be used with SELECT
>> >     CURRENT TRANSACTIONTIME SELECT * FROM person;
>> >
>> >      name
>> >     ------
>> >      Mike
>> >      Mike
>> >
>> >
>> >
>> > This is only a illustration of main functionality. Later I can create a
>> > document about the design and implementation details, but first I need
>> > to
>> > know if such temporal features as described here, could be added to
>> > future
>> > versions of PostgreSQL, after meeting all the requirements of a new
>> > patch.
>> >
>> > Regards
>> >
>> > Miroslav Simulcik
>
>

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to