这个概念是......
你有一张桌子(一张有很多记录的桌子)..
[data1] (call this the 'active' table)
---------
Data1ID (required)
SysID (required)
createdDate (required)
lastUpdatedDate (required)
[mydata] (user's fields)
您还有n个表与Data1保持相同的列。
[data2] (call these the 'inactive' tables)
---------
Data2ID (req.)
SysID (req.)
createdDate (req.)
lastUpdatedDate (req.)
[mydata] (user's fields)
...
[data(n)]
---------
Data(n)ID (req.)
SysID (req.)
createdDate (req.)
lastUpdatedDate (req.)
[mydata] (user's fields)
当用户查询记录时,会激活触发器 启动搜索在Data1上发生(“活动”表) 如果找不到记录,它会检查“非活动”表 下订单。
如果在“非活动”表格中找到记录, 该记录将从该表中删除并插入 Data1('有效'表)。
新记录进入“有效”表格。
在共享sysid的表之间永远不会有冗余记录。
每日工作
数据1:现在 - 过去3个月
数据2:3个月 - 6个月
数据(n):最后定义之前的任何内容等。
任何行修改都会根据“有效”表格应用于“非活动”表格。
“活动”表中位于“非活动”表的“术语”内的lastUpdatedDate的任何记录都将从“活动”表中删除,并移至相应的“非活动”表。非活动表格也会在相同的情况下进行检查。
我的想法是,这种结构可以很容易地添加到现有的 膨胀的表,加快查询性能,同时具有可扩展性 解决方案只需重新定义“术语”范围并添加“非活动”表格即可。
搜索非活动数据显然需要更长的时间。
答案 0 :(得分:1)
这称为sharding。 SQL Server支持称为水平分区的东西,它可以做这种事情。你可以自己动手,或者你可以使用像NHibernate这样透明地做到这一点。
您无法在select语句上运行触发器。您可以创建一个视图或使用一个处理数据库查询的服务/存储库,并继续搜索直到您找到匹配项,但我会考虑使用NHibernate或已经有一些测试支持的东西。
答案 1 :(得分:0)
看起来像滚动你自己的分区。我建议您查看RDBMS供应商提供的分区选项。它们并不完全适合这种情况,但在大多数情况下你可能会发现允许分区修剪的东西。
其他问题
如果要在select上将数据从非活动状态移动到活动“分区”,则选择将不得不减慢以进行数据修改。
数据修改往往需要更重的锁定然后阅读。以Oracle为例。两个查询正在尝试读取相同的记录。通常两者都只是读取值,但是使用这种方案,不是只读取记录,而是通过在表之间移动来尝试修改,而另一个将阻止另一个。