mat*_*use 12 sql design-patterns archive database-administration
我不是一个训练有素的DBA,但执行一些SQL任务并提出这个问题:
在SQL数据库中,我注意到使用归档表模仿具有完全相同字段的另一个表,并且当该数据被认为是存档时用于接受原始表中的行.由于我已经看到这些表位于同一个数据库和同一驱动器上的示例,我的假设是这样做是为了提高性能.这些表格中的行数不超过1000万行......
归档的概念是物理的,而不是逻辑的.逻辑上,归档表包含完全相同的实体,并且应该是同一个表.
身体问题往往是务实的.最重要的概念是"数据库过于(大/慢").归档记录可以更轻松地执行以下操作:
以不同方式优化索引结构.归档表可以包含更多索引,而不会影响工作表上的插入/更新性能.此外,索引可以使用完整页面重建,而工作表通常需要具有50%完整和平衡的页面.
以不同方式优化存储介质.您可以将存档表放在速度较慢/较便宜的磁盘驱动器上,这些驱动器可能具有更多容量
以不同方式优化备份策略.工作表可能需要热备份或日志传送,而存档表可以使用快照.
如果您正在使用它,请以不同方式优化复制.如果存档表每天仅通过夜间批处理更新一次,则可以使用快照而不是事务复制.
不同级别的访问.您可能希望存档表具有不同的安全访问级别.
锁争用.如果您的工作表非常热,您宁愿让您的MIS开发人员访问存档表,在这些存档表中,当他们运行某些东西并且忘记指定脏读语义时,他们不太可能停止操作.
最佳实践不是使用归档表,而是将数据从OLTP数据库移动到具有非规范化数据的MIS数据库,数据仓库或数据集市.但是一些组织将难以证明额外数据库系统的成本(这并不便宜).向现有数据库添加附加表的障碍要少得多.
我经常这么说,但是...
具有相同结构的多个表几乎没有任何意义。
状态标志是一个更好的主意。有一些适当的方法可以提高性能(分区/索引),而无需对数据进行非规范化或以其他方式创建冗余。在现代 RDBMS 世界中,1000 万条记录相当小,因此您所看到的是数据库规划不当或误解的产物。