SQL数据库最佳实践-使用归档表?

14

我不是受过专业训练的数据库管理员,但会执行一些SQL任务并有以下问题:

在SQL数据库中,我注意到使用归档表来模拟另一个具有完全相同字段的表,并用于在数据被视为存档时从原始表接受行。由于我看过这样的表驻留在同一数据库和同一驱动器上的示例,所以我认为这是为了提高性能而做的。这样的表里没有超过约1000万行...

  • 与使用指定行状态的列(例如表示活动/非活动标志的布尔值)相比,为什么要这样做?
  • 在什么情况下这会提高性能?
  • 在给定数据可能仍需要查询(或与当前数据联合)的情况下,最佳的结构模式是什么?
  • 还有什么需要说明的吗?
2个回答

10
档案保管的概念是一个物理概念,与逻辑无关。逻辑上,存档表包含完全相同的实体,应该是同一张表。
物理问题往往是务实的。总体概念是“数据库太大/太慢了”。归档记录可以更轻松地完成以下操作:
  1. 不同的索引结构优化。存档表可以有更多的索引,而不影响工作表的插入/更新性能。此外,索引可以使用完整页面进行重建,而工作表通常希望具有50%满和平衡的页面。
  2. 不同的存储介质优化。您可以将归档表放在速度较慢/价格较便宜的磁盘驱动器上,这些驱动器可能具有更高的容量。
  3. 不同的备份策略优化。工作表可能需要热备份或日志传送,而归档表可以使用快照。
  4. 不同的复制优化,如果您正在使用它。如果归档表每天仅通过夜间批处理更新一次,则可以使用快照,而不是事务性复制。
  5. 不同级别的访问权限。也许您想为归档表设置不同的安全访问级别。
  6. 锁争用。如果您的工作表非常繁忙,您最好让MIS开发人员访问归档表,在那里他们运行某些内容并忘记指定脏读语义时不太可能停止您的操作。
最佳做法是不使用存档表,而是将数据从OLTP数据库移动到MIS数据库、数据仓库或数据集市中的规范化数据。但是,一些组织将难以证明额外的DB系统成本(这些不便宜)。向现有DB添加附加表要比添加新DB系统的障碍要少得多。

1
你最后一段似乎与第一段相矛盾,能否详细说明一下?你让它听起来好像归档应该在同一个表中,但很少这样做。那么...这里的玩法是什么? - Sinjai

3
我经常说一句话,但是......
几乎从来不会出现相同结构的多个表。
状态标志是一个更好的选择。有适当的方法可以提高性能(分区/索引),而不需要去规范化数据或者创建冗余。在现代关系型数据库的世界中,1000万条记录是相对较小的,所以你所看到的是规划不良或对数据库的误解所导致的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接