【问题标题】:Create a Historical Auditing Table创建历史审计表
【发布时间】:2017-06-29 05:39:16
【问题描述】:

目前我们有一个包含超过 1100 万条记录的 AuditLog 表。无论在索引和统计信息上,任何引用该表的查询都需要很长时间。大多数报告不会检查过去一年的审计记录,但我们仍希望保留这些记录。处理这个问题的最佳方法是什么?

我正在考虑保留 AuditLog 表以保存小于或等于一岁的所有记录。然后将任何超过一年的记录移动到 AuditLogHistory 表中。也许只是每晚运行一个批处理文件来移动这些记录,然后更新 AuditLog 表的索引和统计信息。这是完成此任务的好方法吗?或者我应该以什么其他方式存储旧记录?

从 AuditLog 表中带回的记录访问了一个链接服务器,并检查了 6 个不同的数据库,以根据条件查看其中是否存在某个成员。我无权对链接服务器数据库进行任何更改,因此只能优化我所拥有的 Auditlog。访问链接服务器数据库会占用超过 90% 的查询成本。所以我只是想限制我能做的。

【问题讨论】:

  • 尝试您的解决方案并列出优缺点。
  • 在尝试任何事情之前,我想征求意见,如果这是最好的方法。

标签: sql sql-server audit-logging historical-db


【解决方案1】:

首先,我很难相信您不能对包含 1100 万条记录的表优化查询。您应该调查与经常运行的查询相关的索引。

无论如何,您的问题的答案是“分区”。您将按日期列进行分区,并确保在所有查询中都包含此条件。这将减少数据量并可能加快处理速度。

documentation 是学习分区的好起点。

【讨论】:

  • 我同意分区就是答案。我只想补充一件事。 OP 提到索引他们的 AuditLog 表。索引使读取速度更快,但它也使插入速度变慢。一个日志表可能会有很多插入和相对较少的读取。所以他们不应该添加索引,除非他们真的非常需要它们。这根本不会损害他们的报告,但可能会使输入日志的进程变慢。
  • 我有几乎完全相同的场景,除了我有两个链接的审计表,一个大约 100M 行,我不需要保留旧记录。删除超过特定时间的审计记录非常缓慢。事实证明,将表重命名为 auditlog_history,重新创建审计日志表,从重命名的表中插入回其中,然后截断 auditlog_history 表,大约快 80 倍。在您的情况下,您可以跳过截断。当然,您必须删除并重新创建任何外键或索引。
  • 从 AuditLog 表中带回的记录访问链接服务器并检查 6 个不同的 db,以根据条件查看其中是否存在某个成员。我无权对链接服务器数据库进行任何更改,因此只能优化我所拥有的 Auditlog。访问链接服务器数据库会占用超过 90% 的查询成本。所以我只是想限制我能做的。谢谢,我会研究分区。
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2011-05-22
  • 2016-12-30
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2015-01-10
相关资源
最近更新 更多