2010-08-13 5 views
0

linq2sql을 사용하여 SQL 2005의 테이블에서 약 150,000 개의 레코드를 업데이트하려고합니다. 그것이 xx.SubmitChanges()에 관해서는 약 45 분이 걸립니다.LinqToSQL을 C에서 최적화하는 방법 #

쿼드 코어 PC에서 로컬 인스턴스로 sql을 실행하고 있습니다.

왜 이렇게 오래 걸리는지 아십니까? 아니면 정상입니까?

코드 샘플 :이 거기 컨텍스트에 하나 개의 기록하여 하나의 삽입이 경우를 sql.In하는 LINQ에는 대량 삽입이없고 마침내가는 많은 시간이 걸릴에 저장됩니다

var y = db.x.Where(j => j.NumberOfOrders > 0).Select(k => k); 

foreach (var item in y) 
{ 
    try 
    { 
     item.k = "bla"; 
    } 
    catch (Exception ex) 
    { 
     // 
    } 
} 

db.SubmitChanges(); 

답변

5

당신의 SubmitChanges()를 호출 할 때 데이터베이스가 필요하므로 시간이 걸립니다.

150,000 개의 레코드와 같은 큰 레코드가있는 경우 sql에서 Bulk insert을 사용하는 것이 더 좋습니다. 삽입하는 데 몇 초 밖에 걸리지 않습니다.

+0

이 작업은 삽입이 아니라 업데이트입니다. – umbyersw

2

는 어디 (같은 일을 투사하기 때문에 당신은() 선택이 필요하지 않습니다)

그리고 단순한의 할당은 대한 시도 - 캐치을 사용할 필요가 없습니다.

그러나

확실히 할 수있는 가장 좋은 방법은 대량 삽입 물건 anishmarokey은이가 할 데이터베이스를 사용할 수있는 업데이트 쿼리 (또는 저장 프로 시저)와 함께 할 것으로 약

+0

안녕하세요 @ 카를로스, 실제로 조심해야 할 블록에서 조금 더 진행되고 있지만 코드 샘플에는 필요하지 않습니다. 그러나 .Select() 팁을위한 thx. 그것을 조심해라. 대량 복사도 가능합니다. – Grant

1

큰 업데이 트를 이야기하고 있다는 점이다 무거운 짐을 싣기 (그리고 거래 관리/일관성). 나는 당신이 예제를 간소화하고 있다는 것을 알고 있습니다. 그러나 이것과 같은 것은 어떨까요 :

string CommandText = "UPDATE x SET k = @k WHERE NumberOfOrders > 0"; 
using (SqlConnection conn = new SqlConnection(My.Settings.DatabaseConnection)) { 
    using (SqlCommand cmd = new SqlCommand(CommandText, conn)) { 
     cmd.Parameters.AddWithValue("@k", "bla"); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

@k로 작동하는지 확실하지 않은 것은 각 레코드마다 다릅니다. 대량 삽입을해야 할 것 같아요 ...? – Grant

+0

@Grant, 불행하게도 새로운 레코드를 삽입하지 않고 기존 레코드를 업데이트하고 있습니다 ... 모든 종류의 데이터 조작 문제를 해결하기 위해 데이터베이스 내에 * 많은 * 솔루션이 있으며 효율적으로 수행 할 수 있습니다. – umbyersw

+0

DataContext db.ExecuteCommand (UPDATE x SET k = {0} NumberOfOrders> 0, "bla") 메서드를 사용할 수있었습니다. – Kikaimaru

관련 문제