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



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

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

  • 为什么要这样做,而不是使用列来指定行的状态,例如in/active标志的布尔值
  • 这将在什么程度上提高性能
  • 考虑到数据可能仍需要查询(或与当前数据统一),正确构建这种结构的最佳模式是什么
  • 对此还有什么好说的呢

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

身体问题往往是务实的。总体概念是"数据库变得太大/太慢"。存档记录可以更容易地执行以下操作:

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

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

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

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

  5. 不同级别的访问。也许您希望归档表具有不同的安全访问级别。

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

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

我经常这么说,但。。。

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

一个状态标志是一个更好的主意。有适当的方法可以提高性能(分区/索引),而不会破坏数据规范或以其他方式创建冗余。在现代rdbms的世界里,1000万条记录是很小的,所以你看到的是糟糕的计划或对数据库的误解。

最新更新