c# – 多个查找的推荐编程模式
我的任务是在另一个供应商生成的CSV文件和超过300个独立但结构相同的CRM数据库之间创建数据同步过程.所有CRM数据库都在同一SQL Server实例中定义.以下是具体内容:
源数据将是CSV,其中包含客户选择加入营销通信的所有电子邮件地址的列表.此CSV文件将每晚完整发送,但将包含记录级日期/时间戳,这将允许我仅选择自上次处理周期以来已修改的记录. CSV文件可能会有数十万行,但每天的预期变化将大大低于此. 我将从CSV中选择数据,并将每行转换为自定义列表< T>宾语. 一旦查询了CSV并且数据已被转换,我将需要比较该List< T>的内容.针对CRM数据库.这是因为CSV文件中包含的任何给定电子邮件地址可能是: > 300个数据库中的任何一个都不存在 在主CSV列表中的电子邮件地址与任何CRM数据库之间存在匹配的任何情况下,匹配的CRM记录将使用CSV文件中包含的值进行更新. 在一个很高的,非常通用的层面上,我在想我必须做这样的事情: foreach(string dbName in masterDatabaseList) { //open db connection foreach(string emailAddress in masterEmailList) { //some helper method that would execute a SQL statement like //"IF EXISTS ... WHERE EMAIL_ADDRESS = <emailAddress>" return true; bool matchFound = EmailExistsInDb(emailAddress) if (matchFound ) { //the current email from the master list does exist in this database //do necessary updates and stuff } } } 这是最有效的方法吗?我不想热衷于数百次访问300个数据库,以查看主CSV列表中是否存在每个电子邮件.理想情况下,我想生成一条SQL语句: "SELECT * FROM EMAIL_TABLE WHERE EMAIL_ADDRESS IN(email1,email2,email3,...)" 这将允许对数据库执行单个查询,但我不知道这种方法是否会更好/更有效,特别是因为我必须动态生成SQL并且可能会将其打开以进行注入. 这种情况下的最佳做法是什么?因为我每次都需要比较300个数据库,所以我正在寻找一种能够以最少的处理时间产生最佳结果的方法.在我的生产代码中,我将实现一个多线程方法,以便可以同时处理多个数据库,因此任何方法都需要是线程安全的. 解决方法
你似乎有正确的基本想法.为CSV中的每一行命中数据库一次会太慢.你可以通过LINQ创建一个“where in”语句,如下所示:
var addresses = GetEmailAddresses(); var entries = ctx.Entries.Where(e => addresses.Contains(e.EmailAddress)); 但是,如果列表中的地址太多,则生成和评估查询需要很长时间.我建议将输入列表分成合理大小的批次(200个条目?),然后使用上面的技巧通过单个数据库检查处理每个批处理. 一旦你有了这个工作,你可以尝试一些其他的东西,看看他们是否在性能方面做出了可测量的差异: >调整批量大小.>以不同程度的并行度独立运行批次.>在数据库表上使用索引,尤其是在电子邮件地址字段中.>在将电子邮件地址分成批次之前订购电子邮件地址. db查询可能会更好地利用硬盘缓存策略. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |