我编写了一个实验室处理软件,它接收传入的数据,将其分解,并将其发送到数据库中的适当字段。数据库表非常大,而且有很多字段。在插入数据之前,我会在插入之前进行重复检查(我们从多个源获取重复数据)。
系统通过解析传入数据,填充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语句来进行重复数据删除和运行传统查询会更快?这个陈述是缓慢的,但它有效,经过单元测试并阻止欺骗。我正在寻找更快更等同的东西(不是很难,我知道)或更干净......
答案 0 :(得分:1)
您可以在名称,dob和....上定义表的唯一索引。每个插入都可以成功完成或引发唯一约束违例异常。所以在插入之前你不需要任何检查。我认为这是最直接的做法。
答案 1 :(得分:0)
如果没有其他进程添加到SQL表,那么您可以在启动程序时将表读入HashSet。检查本地HashSet。如果不在HashSet中,则将其添加到SQL表和HashSet中。 HashSet查找比在同一物理盒上运行的SQL查询快约100倍。我用它来做一些大负荷。
如果您只是在短时间内获得重复,那么您可以在开始时跳过从表中加载历史记录或仅加载最后一个X.检查HashSet并且仅当在HashSet中找不到时才使用SP来插入或跳过。并定期将HashSet截断为X.