如何在 C# 中将插入的行捕获到一个巨大的表中? [关闭]
Posted
技术标签:
【中文标题】如何在 C# 中将插入的行捕获到一个巨大的表中? [关闭]【英文标题】:How to catch inserted rows to a huge table in c#? [closed] 【发布时间】:2020-02-22 07:54:11 【问题描述】:我无法访问源代码的旧系统正在将数据插入到一个巨大的表中(已经插入了数百万条记录。)。选择命令超出容差时间。因此,如果可能的话,我想捕获新记录并将它们发送到新的 MQ 机制。所以我可以轻松地从队列中处理它们。
人们建议我使用“更改数据捕获”或“SQL 触发器”。但我不认为它可以处理频繁添加的行(可能 1k 新记录五分钟。)。
你对这种情况有什么建议?
(SQL Server 2016 - C# 消费者)
感谢您的建议!
【问题讨论】:
每天百万/30 万行实际上并没有那么大。由于您似乎可以访问 RDBMS,因此只需添加与选择查询的需求对齐的索引或分区有帮助吗?还有可能是清除和/或移动旧数据的计划作业? 您不相信已经获得的建议解决方案。为什么要相信我们的建议? 每分钟 1k 行并不频繁。触发器或 CDC 等 IT 技术无法处理它们将毫无用处。完全没用。你真的问哪辆车能超过 20 公里/小时,这就是你的要求。 @SirRufo 因为有太多的替代观点可以解决得更好。有时人们从窗户往外看,但您可能从前面看,却看不到后花园及其壮丽的景色。 我也尝试在桌面上启用 CDC,但时间太长,所以我取消了它。但现在我会更多地研究它,现在我知道我不会白白浪费时间。谢谢大家! 【参考方案1】:解决方案 1:使用更好的索引
我可以想到另一种方法,创建一个索引并从您的代码中轮询表,始终保留您处理的最后一个 id(以某种持久的方式,以便即使您的应用程序失败也可以访问它)。
解决方案 2:更改数据捕获
这是最安全的方法。这些表是从事务日志中更新的,对性能或插入事务的影响最小甚至没有。
您还可以添加一些自动清理功能,这样表格就不会变得臃肿。吞吐量并不多,它会以良好的清理间隔轻松处理。
缺点是如果间隔足够短,您可能会丢失数据。
解决方案 3:触发器
到目前为止,我认为是最好的。像 MyTableName_LiveData 一样创建一个重复的表(具有相同的列)。
在原始表中创建一个触发器,它将同一行插入到新表中。 Sql Server trigger insert values from new row into another table
CREATE TRIGGER yourNewTrigger ON yourSourcetable
FOR INSERT
AS
INSERT INTO yourDestinationTable
(col1, col2 , col3, user_id, user_name)
SELECT
'a' , default , null, user_id, user_name
FROM inserted
go
当您访问一行时,从临时表中删除,以免它本身变得不可用。
缺点是
-
如果触发器失败,插入原表也会失败
对架构的任何更改都必须应用于两个表
插入将需要更多时间(可以忽略不计,但我不得不提及)。
【讨论】:
以上是关于如何在 C# 中将插入的行捕获到一个巨大的表中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章