【问题标题】:Is there a more efficient method to find dupes in Sql server有没有更有效的方法在 Sql server 中查找骗子
【发布时间】:2023-03-23 18:58:01
【问题描述】:

我有这个question,我为此提供了一个解决方案。但是,我觉得这并没有达到应有的效率:

using (DataContext context = new DataContext(SqlConnection)
{
    var custInfo = context.GetTable<tbl_CustomerInfo>();

    string compID = ImportCust.Rows[0]["CompanyID"].ToString();

    var imports = from cust in ImportCust.AsEnumerable()
                  select cust.Field<int>("CustomerID");

    var dupes = from import in imports
                join cust in custInfo
                on import equals cust.CustomerID 
                where cust.CompanyID== pivnum
                select cust;

    var records = dupes.GetEnumerator();

    while (records.MoveNext())
    { custInfo.DeleteOnSubmit(records.Current); }

    context.SubmitChanges();
}

我使用Stopwatch 来查看从records 到完成SubmitChanges 所经过的时间跨度迭代。流逝的时间似乎没有韵律或理由:

10666 条记录在 20 秒内完成
12 秒内完成 15425 条记录
21 秒内完成 289 条记录

显然,可以加快速度的一件事是如果我要删除索引。可以以编程方式完成吗?另外,有没有比我提供的更好的方法?

【问题讨论】:

  • 老实说,寻找骗子最有效的地方是在野兽的肚子里(在数据库 - 存储过程中)。如果您的 UI/演示文稿的某些要求是“显示重复项”,我会感到惊讶。我猜这是维护?
  • 这两组记录是否都已存储在数据库中,还是 ImportCust 记录仅在内存中?
  • @Chris:ImportCust 是一个内存数据表。但现在这种情况正在改变。我会将 ImportCust 推送到 SqlServer 中的临时表并为此工作运行 SP。
  • @dboarman:这绝对是处理这个问题的最佳方式。
  • @Chris:我完全同意,在我的经理看到这项工作比阿拉斯加的糖蜜要慢后,他改变了将工作放在哪里的想法。虽然我可以对 codez 进行改进,但工作效率可能是最小的收益。就像 RPM1984 所说的,把这项工作放在野兽的肚子里。

标签: c# linq-to-sql .net-3.5 linq-to-objects


【解决方案1】:

你可以使用 SQL 语句:

-- TSQL (SQL Server 2005/2008): --

select CompanyID from tbl_CustomerInfo
    group by CompanyID
    having COUNT(*)>1

【讨论】:

    【解决方案2】:

    Tefod的sql的linq版本:

    from ci in dc.tbl_CustomerInfo
    group ci by ci.CompanyID into g
    where g.Count() > 1
    select g.Key
    

    【讨论】:

    • +1:非常好。我也可以在其他项目中使用它。我似乎很适合“数据实用程序开发人员”这个头衔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2017-07-11
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多