假设有一个数据库表:A 表,该表每时每刻都会产生数据,且该表没有主键来标识唯一性,也没有时间等可以标识范围的列,数据只有增加没有删除。
那么问题来了:
不考虑 A 表为什么这么设计,也不考虑分库分表以及 A 表查询效率等问题,只考虑如何最大效率地保存 A 表每个小时点的快照,任意一个数据库(postgre,mysql,oracle 都可以)
我目前想到的解决方案如下:
CREATE TABLE TMP001 AS SELECT * FORM ATABLE
,但是这样我感觉效率好像不高,而且每一次都生成数据,容易导致硬盘爆炸除了以上解决方案,我想问一下数据库有没有一种类似 CREATE VIEW AS 的功能,但是在创建视图之后,不再收到原有 A 表增加数据的影响。这个功能点不知道大家有没有遇到过,求解,谢谢!
1
saulshao 2018-10-18 17:33:37 +08:00 1
我见过一个应用系统有类似的功能,但是是由应用程序实现的。
简单地说就是对于某个表进行写操作之前,把需要写的行 insert 到一个和源表对应的历史表中。 |
2
opengps 2018-10-19 08:43:11 +08:00
select * into tableYYYYMMDDHH from table
|
3
nekoneko 2018-10-19 08:58:51 +08:00
google or baidu:数据库分表
|
4
loveCoding 2018-10-19 09:26:32 +08:00
就是二楼说的按时间分表吧
|
5
Aksura 2018-10-22 17:22:49 +08:00
@iloveyouso 既然需求要查询历史整点数据,那么从这个 A 表里周期性地保存出数据就不可避免。担心硬盘爆炸,就划定一个历史数据的保留时间窗口,超出窗口外的数据,要么归档另存他处,要么删除。
方案一每次查询都新建表,个人感觉没必要,表的数量很容易就膨胀了,用一个分区表保存历史就可以了。保存历史数据的表除了具有 A 表的字段外,再加标识查询时间的字段。还可按年、月之类的做表分区。考虑到 A 表是“只有增加,没有删除”这个特点,整点查询 A 表数据到历史表时,如果是 Oracle 可以考虑用 Merge 语句代替单纯的 Insert 语句。 主要问题还是A表没有主键,也没有其他唯一性的标志或时间字段,如何高效地判断哪些数据行是新增数据感觉不好做。 另外,最后说的“类似 CREATE VIEW AS 的功能,但是在创建视图之后,不再收到原有 A 表增加数据的影响”,物化视图应该是你要找的东西。 |