加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 多个查找的推荐编程模式

发布时间:2020-12-15 22:04:56 所属栏目:百科 来源:网络整理
导读:我的任务是在另一个供应商生成的CSV文件和超过300个独立但结构相同的CRM数据库之间创建数据同步过程.所有CRM数据库都在同一SQL Server实例中定义.以下是具体内容: 源数据将是CSV,其中包含客户选择加入营销通信的所有电子邮件地址的列表.此CSV文件将每晚完整
我的任务是在另一个供应商生成的CSV文件和超过300个独立但结构相同的CRM数据库之间创建数据同步过程.所有CRM数据库都在同一SQL Server实例中定义.以下是具体内容:

源数据将是CSV,其中包含客户选择加入营销通信的所有电子邮件地址的列表.此CSV文件将每晚完整发送,但将包含记录级日期/时间戳,这将允许我仅选择自上次处理周期以来已修改的记录. CSV文件可能会有数十万行,但每天的预期变化将大大低于此.

我将从CSV中选择数据,并将每行转换为自定义列表< T>宾语.

一旦查询了CSV并且数据已被转换,我将需要比较该List< T>的内容.针对CRM数据库.这是因为CSV文件中包含的任何给定电子邮件地址可能是:

> 300个数据库中的任何一个都不存在
>存在于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查询可能会更好地利用硬盘缓存策略.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读