如何在 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# 中将插入的行捕获到一个巨大的表中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键

在 phpmyadmin 中将列插入到预先存在的表中

MySql 的行数并插入到计数的表中

如何在不让日志文件失控的情况下从巨大的表中删除过期数据?

在一个巨大的表中处理删除/插入/选择

在 laravel 中将一些用户信息保存到不同的表中