场景:
有200个检测点,每个检测点每天采集5个数据,对表的读写都是随机的(即有可能同时读写),总共有5年的数据。
存储方案A:
日期 | 点号 | 类型 | 值 |
20120101 | 001 | A | 1.0 |
20120101 | 001 | B | 2.0 |
20120101 | 001 | C | 3.0 |
存储方案B:
日期 | 类型 | 001 | 0002 | 003 | ... |
20120101 | A | 1.0 | 1.0 | 1.0 | ... |
20120101 | B | 2.0 | 2.0 | 2.0 | ... |
20120101 | C | 3.0 | 4.0 | 4.0 | ... |
若采用方案A,所有的点在一个表里,行数就非常多,如果一个点一张表表就太多。扩展数据点时容易一些。
采用方案B,所有点在一个表里,一个点一天5条记录,一天1000条,一年下来也就是30多W条,几年的数据也不到1000W,做好索引查询,查询也不会慢。缺点是扩展数据点需要改表,我们采用预留字段的方式解决。
问题:
1.对某个数据点做跨年计算时,需要更新对应的数据。采用的是按天和类型取出一条删除,更新字段值之后插入,使用了事务处理。
2.同时页面查询该表(需要跟其它表联合),有时会出现“事务与另一个进程被死锁。。。。”异常,后来就在查询时添加了with(nolock)
3.当计算和查询并行时,我有个页面需要把某天的5个类型数据都读出来,因为写时事务加锁了,读的时候使用with(nolock)就没读出来锁定的行,结果是数据不全
解决方案:
开启数据库的快照隔离事务模式,去掉with(nolock)。
参考地址:
http://msdn.microsoft.com/zh-cn/library/vstudio/tcbchxcb.aspx