gpt4 book ai didi

c# - 多次查找的推荐编程模式

转载 作者:太空狗 更新时间:2023-10-30 01:57:45 25 4
gpt4 key购买 nike

我的任务是在另一个供应商生成的 CSV 文件与 300 多个独立但结构相同的 CRM 数据库之间创建数据同步过程。所有 CRM 数据库都在同一个 SQL Server 实例中定义。以下是具体情况:

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

我将从 CSV 中选择数据并将每一行转换为自定义 List<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 并可能打开它注入(inject)。

这种情况下的最佳做法是什么?因为我有 300 个数据库需要每次进行比较,所以我正在寻找一种能够以最少的处理时间产生最佳结果的方法。在我的生产代码中,我将实现多线程方法,以便可以同时处理多个数据库,因此任何方法都需要是线程安全的。

最佳答案

您的基本思路似乎是正确的。为 CSV 中的每一行访问一次数据库会太慢。您可以像这样通过 LINQ 创建“where in”语句:

var addresses = GetEmailAddresses();
var entries = ctx.Entries.Where(e => addresses.Contains(e.EmailAddress));

但是,如果您的列表中有太多地址,生成和评估您的查询将需要很长时间。我建议将您的输入列表分成大小合理的批处理(200 个条目?),然后使用上面的技巧通过一次数据库检查来处理每个批处理。

完成该操作后,您可以尝试其他一些操作,看看它们是否会在性能方面产生可衡量的差异:

  1. 调整批量大小。
  2. 以不同的并行度独立运行批处理。
  3. 使用数据库表上的索引,尤其是电子邮件地址字段上的索引。
  4. 在将电子邮件地址分成几批之前对其进行排序。数据库查询可能会更好地利用硬盘缓存策略。

关于c# - 多次查找的推荐编程模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com