Есть ли более эффективный метод для поиска дупов на сервере Sql - PullRequest
1 голос
/ 16 декабря 2010

У меня есть вопрос , для которого я предоставил решение.Тем не менее, я не думаю, что это так эффективно, как могло бы быть:

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 секунд
15425 записей завершено за 12 секунд
289 записей завершено за 21 секунду

* 1016то, что ускорило бы ситуацию, - это если бы я опустил индексы.Это можно сделать программно?Кроме того, есть ли лучший метод, чем то, что я предоставил?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2010

вы можете использовать SQL-статистику:

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

select CompanyID from tbl_CustomerInfo
    group by CompanyID
    having COUNT(*)>1
2 голосов
/ 16 декабря 2010

Линк версия Тефода sql:

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