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

时间:2014-01-16 23:42:14

标签: sql design-patterns archive database-administration

我不是经过培训的DBA,但执行一些SQL任务并提出这个问题:

在SQL数据库中,我注意到使用归档表模仿具有完全相同字段的另一个表,并且当该数据被认为是存档时用于接受原始表中的行。由于我已经看到这些表位于同一个数据库和同一驱动器上的示例,我的假设是这样做是为了提高性能。这些表格中的行数不超过1000万行......

  • 为什么要这样做而不是使用列来指定行的状态,例如in / active标志的布尔值?
  • 这会改善表现吗?
  • 如果仍然需要查询数据(或与当前数据联合),那么正确构建此类数据的最佳模式是什么?
  • 还有什么可说的呢?

2 个答案:

答案 0 :(得分:6)

存档的概念是物理的,而不是逻辑的。逻辑上,归档表包含完全相同的实体,并且应该是同一个表。

身体问题往往是务实的。最重要的概念是“数据库过于(大/慢”)。存档记录可以更轻松地执行以下操作:

  1. 以不同方式优化索引结构。归档表可以包含更多索引,而不会影响工作表上的插入/更新性能。此外,索引可以使用完整页面重建,而工作表通常希望页面具有50%的完整和平衡。

  2. 以不同方式优化存储媒体。您可以将存档表放在速度较慢/较便宜的可能具有更大容量的磁盘驱动器上。

  3. 以不同方式优化备份策略。工作表可能需要热备份或日志传送,而存档表可以使用快照。

  4. 如果您正在使用它,请以不同方式优化复制。如果存档表每天仅通过夜间批处理更新一次,则可以使用快照而不是事务复制。

  5. 不同级别的访问权限。您可能希望存档表具有不同的安全访问级别。

  6. 锁定争用。如果你的工作表非常热,你宁愿让你的MIS开发人员访问存档表,他们在运行某些东西时不太可能停止你的操作而忘记指定脏读语义。

  7. 最佳做法是不使用归档表,而是将数据从OLTP数据库移动到具有非规范化数据的MIS数据库,数据仓库或数据集市。但是一些组织将难以证明额外数据库系统的成本(这并不便宜)。将附加表添加到现有数据库的障碍要少得多。

答案 1 :(得分:0)

我经常说这个,但是......

相同结构的多个表几乎没有意义。

状态标志是一个更好的主意。有适当的方法来提高性能(分区/索引),而不会使数据非规范化或以其他方式创建冗余。在现代rdbms世界中,1000万条记录相当小,所以你所看到的是数据库规划不当或误解的结果。