0

我编写了一个实验室处理软件,它接收传入的数据,将其分解,并将其发送到数据库中的适当字段。DB表真的很大,字段也很多。在插入数据之前,我会在插入数据之前进行重复检查(我们从多个来源获取重复数据)。

系统通过解析传入数据、填充 linq-to-sql 对象来工作。重复检查通过对 linq-to-sql 对象列表执行 .where 操作来选择尚未在表中的对象。

例如 ...

input=list (of TableA) 'linq to sql objects
output=input.where(function (x as TableA) not myDb.TableA.any(function(l as table) l.name=x.name, l.dob=x.dob..etc for 10 fields..).tolist

语法有点神秘,但这是我能找到的在 linq 上执行内连接到 sql 对象和数据库记录的唯一方法。在我使用这种方法之前,我逐行执行重复检查,这要慢得多。

据我了解,Linq 正在将此 linq 语句转换为在服务器上运行的 sql 语句。

我的问题是:有没有办法让它运行得更快?有没有理由期望写出一条 sql 语句来执行重复数据删除和运行传统查询会更快?该语句很慢,但它有效,经过单元测试并阻止了欺骗。我正在寻找更快且相当干净(我知道不难)或更清洁的东西......

4

2 回答 2

1

您可以根据名称、dob 和 ... 在表上定义唯一索引。每次插入都可以成功完成或引发唯一约束违规异常。所以在插入之前你不需要任何检查。我认为这是最直接的做法。

于 2012-11-29T23:52:19.937 回答
0

如果没有其他进程添加到 SQL 表中,那么您可以在启动程序时将该表读入 HashSet。检查本地 HashSet。如果不在 HashSet 中,则将其添加到 SQL Table 和 HashSet。HashSet 查找比 SQL 查询快大约 100 倍,即使在同一个物理机器上运行也是如此。我将它用于一些大负载。

如果您只想在短时间内获得重复数据,那么您可以在开始时跳过从表中加载历史记录,或者只加载最后一个 X。检查 HashSet 并且只有在 HashSet 中找不到时才使用 SP 插入或跳过. 并定期将 HashSet 截断为 X。

于 2012-11-30T22:01:40.290 回答