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

mat*_*use 12 sql design-patterns archive database-administration

我不是一个训练有素的DBA,但执行一些SQL任务并提出这个问题:

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

  • 为什么要这样做而不是使用列来指定行的状态,例如in/active标志的布尔值?
  • 这会在什么时候提高性能?
  • 鉴于数据可能仍需要查询(或与当前数据联合),那么正确构造这种模式的最佳模式是什么?
  • 还有什么可说的呢?

Joh*_* Wu 6

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

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

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

  2. 以不同方式优化存储介质.您可以将存档表放在速度较慢/较便宜的磁盘驱动器上,这些驱动器可能具有更多容量

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

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

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

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

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


Har*_* CO 3

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

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

状态标志是一个更好的主意。有一些适当的方法可以提高性能(分区/索引),而无需对数据进行非规范化或以其他方式创建冗余。在现代 RDBMS 世界中,1000 万条记录相当小,因此您所看到的是数据库规划不当或误解的产物。