使用DB4AI-Snapshots。
-
创建DB4AI-Snapshots
-
示例1:CREATE SNAPSHOT…AS
示例如下,其中,默认版本分隔符为 “@”, 默认子版本分割符为 “.”,该分割符可以分别通过GUC参数db4ai_snapshot_version_delimiter以及db4ai_snapshot_version_separator进行设置。
create snapshot s1@1.0 comment is 'first version' as select * from t1; schema | name --------+-------- public | s1@1.0 (1 row)
上述结果提示已经创建了数据表 s1的快照,版本号为 1.0。创建好后的数据表快照可以像使用一般视图一样进行查询,但不支持通过“INSERT INTO”语句进行更新。例如下面几种语句都可以查询到数据表快照s1的对应版本 1.0的内容:
SELECT * FROM s1@1.0; SELECT * FROM public.s1@1.0; SELECT * FROM public . s1 @ 1.0; id | name ----+---------- 1 | zhangsan 2 | lisi 3 | wangwu 4 | lisa 5 | jack (5 rows)
可以通过下列SQL语句修改数据表t1的内容:
UPDATE t1 SET name = 'tom' where id = 4; insert into t1 values (6, 'john'); insert into t1 values (7, 'tim');
再检索数据表t1的内容时,发现虽然数据表t1的内容已经发生变化,但是数据表快照 s1@1.0 版本的查询结果并未发生变化。由于数据表t1的数据已经发生了改变,如果将当前数据表的内容作为版本2.0,则可创建快照s1@2.0,创建的SQL语句如下:
create snapshot s1@2.0 as select * from t1;
通过上述例子,我们可以发现,数据表快照可以固化数据表的内容,避免中途对数据的改动造成机器学习模型训练时的不稳定,同时可以避免多用户同时访问、修改同一个表时造成的锁冲突。
-
示例2:CREATE SNAPSHOT…FROM
SQL语句可以对一个已经创建好的数据表快照进行继承,利用在此基础上进行的数据修改产生一个新的数据表快照。例如:
create snapshot s1@3.0 from @1.0 comment is 'inherits from @1.0' using (INSERT VALUES(6, 'john'), (7, 'tim'); DELETE WHERE id = 1); schema | name --------+-------- public | s1@3.0 (1 row)
其中,“@”为数据表快照的版本分隔符,from子句后加上已存在的数据表快照,用法为“@”+版本号,USING关键字后加入可选的几个操作关键字(INSERT …/UPDATE …/DELETE …/ALTER …),其中 “INSERT INTO”以及“DELETE FROM”语句中的“INTO”、“FROM”等与数据表快照名字相关联的子句可以省略,具体可以参考AI特性函数。
示例中,基于前述s1@1.0快照,插入2条数据,删除1条新的数据,新生成的快照s1@3.0,检索该s1@3.0:
SELECT * FROM s1@3.0; id | name ----+---------- 2 | lisi 3 | wangwu 4 | lisa 5 | jack 6 | john 7 | tim (7 rows)
-
-
删除数据表快照SNAPSHOT
purge snapshot s1@3.0; schema | name --------+-------- public | s1@3.0 (1 row)
此时,已经无法再从s1@3.0 中检索到数据了,同时该数据表快照在db4ai.snapshot视图中的记录也会被清除。删除该版本的数据表快照不会影响其他版本的数据表快照。