我在 MS SQL 中有一个大表,当第三方应用程序向其写入时,我遇到了读取问题。我解决这个问题的计划是将所有数据从一个数据库移动并定期删除源数据库中的数据。当表中的数据太多(数亿行)时,就会出现问题,但我需要能够读取可能超过十亿行的行的所有数据。我无法修改源数据库,因为它是第三方的。
我很好奇有哪些选项可以帮助实现这一点。是否可以复制表,以便当我删除源表中的数据时,目标表中的数据不会被删除?
答案1
这个问题有多种解决方案。选择正确的解决方案取决于您的环境和需求,本文不作详细介绍。
根据您所述的查询数百万(或十亿)行表的全部需求,我预计您需要从供应商的数据库中进行一些报告。以下是我会考虑的一些潜在解决方案,以实现该目标:
- READ UNCOMMITTED:以 READ UNCOMMITTED 方式执行查询(例如 WITH NOLOCK)。这将确保查询和 OLTP 活动不会互相干扰,但如果您查询的是最新数据,结果可能会有点混乱。
- 快照:为只读查询创建数据库快照。定期刷新它们,或在运行报告之前刷新它们(如果它们是临时的)。如果报告性能是您想要清除表中数据的唯一原因,那么这可能是您的最佳解决方案。
- ETL:在包含所需表的同一台服务器上创建一个 _Archive 数据库。使用每日/每周/每月归档作业从 prod DB 填充它们,该作业将数据从 prod DB 移入其中,然后在插入成功后从 prod 中删除。
多一点的信息也许能帮助我们更好地为您提供帮助。
答案2
标准方法是使用某种 ETL 脚本在删除之前复制数据。
答案3
- 插入在创建时复制每个新条目的触发器
- 脚本定期运行或在删除之前运行,插入非重复的行。
您的数据仓库表根本没有必要放在同一台服务器上,更不用说与有约束的实时数据库绑定了。删除操作不会影响仓库。只需添加数据的命令即可。