如何在 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 这样它就不会变得不可用。
缺点是
- 如果触发器失败,插入到原来的table也会失败
- 对架构的任何更改都必须应用于 tables
- 插入将花费更多时间(可以忽略不计,但我不得不提及)。
一个我无法访问源代码的旧系统正在向一个巨大的 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 这样它就不会变得不可用。
缺点是
- 如果触发器失败,插入到原来的table也会失败
- 对架构的任何更改都必须应用于 tables
- 插入将花费更多时间(可以忽略不计,但我不得不提及)。