如何在 C# 中将插入的行捕获到巨大的 table?

How to catch inserted rows to a huge table in c#?

一个我无法访问源代码的旧系统正在向一个巨大的 table 中插入数据(已经插入了超过数百万条记录。)。 Select 命令超出容差时间。因此,如果可能的话,我想捕获新记录并将它们发送到新的 MQ 机制。所以我可以很容易地从队列中处理它们。

人们建议我使用 "Change data capture" 或 "SQL Triggers"。但我不认为它可以处理频繁添加的行(五分钟内可能有 1k 条新记录。)。

对于这种情况,你有什么建议?

(SQL 服务器 2016 - C# 消费者)

多谢指教!

解决方案 1:使用更好的索引

我可以想到另一种方法,创建一个索引并从您的代码中轮询 table,始终保留您处理过的最后一个 ID(以某种持久的方式,以便您可以访问它,即使你的申请失败了)。

解决方案 2:更改数据捕获

这是最安全的方式。 table 是从事务日志更新的,对性能或插入事务的影响最小到 none。

您还可以添加一些自动清理功能,这样 table 就不会变得臃肿。吞吐量不是那么多,它会以良好的清理间隔轻松处理它。

缺点是如果间隔足够短,您可能会丢失数据。

解决方案 3:触发器

迄今为止我认为最好的。创建一个副本 table(具有相同的列)像 MyTableName_LiveData.

在原来的 table 中创建一个触发器,将同一行插入到新的 table 中。 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

当您访问一行并且正在处理时,从临时文件中删除 table 这样它就不会变得不可用。

缺点是

  1. 如果触发器失败,插入到原来的table也会失败
  2. 对架构的任何更改都必须应用于 tables
  3. 插入将花费更多时间(可以忽略不计,但我不得不提及)。