2012-06-19 3 views
1

DbLinq을 통해 MySQL 데이터베이스에 연결하는 ASP.NET MVC2 사이트가 있습니다. 일정한 간격으로 사이트에서 수행되는 특정 작업 집합이 있습니다. 여기에는 몇 가지 테이블의 특정 레코드 집합을 반복하고 업데이트하여 일부 다른 테이블에 새 레코드를 추가하는 작업이 포함됩니다.DbLinq의 개체 추적 성능을 향상시킬 수 있습니까?

나는 적당한 크기의 데이터 세트로 테스트 해왔다. 지금 내 특정 테스트 세트에서 업데이트를하면 44 개의 새로운 행을 삽입하고 81 개의 다른 행을 업데이트합니다. 그러나 SubmitChanges()에 대한 나의 호출은 매우 오랜 시간이 걸립니다. ~ 3-4 분, DB에 대한 변화가 상대적으로 적습니다.

필자는 결국 간단한 프로파일 링을했는데, 문제는 데이터베이스에서 쿼리를 실행하거나 쿼리를 작성하는 것과 관련이없는 것으로 나타났습니다. 대부분의 시간은 UpdateEntity 내부에서 AllTrackedEntities.ContainsReference() 호출에 의해 처리 된 것으로 보입니다. SubmitChangesImpl에서

  • 시간 : 204,884 MS UpdateEntity에서
    • 시간 : 200,908 MS ContainsReference에서
      • 시간 : 148,173 MS

        는 내가 가진 최근의 테스트 실행에서, 몇 가지 실제 번호를 부여하려면
      • QueryBuilder.GetUpdateQuery의 시간 : 685 ms
      • QueryRunner.Update의 시간 : 28 ms
      • UpdateReferencedObjects에서
      • 시간 : 49958 MS

당신이 볼 수 있듯이, 건물과 SQL 쿼리를 실행하는이 시간의 양에 비하면 정말 왜소 소요 된 개체에 대한 참조가 존재하는지 확인 우리는 업데이트 중입니다 (아무런 참조가 없다면 엔티티가 삽입됩니다.이 경우 엔 모든 업데이트 된 엔티티가 존재합니다). 왜 이런 일이 발생하는지, 데이터 무결성을 유지하기 위해 이러한 일이 발생하는 것으로 알고 있는데, 이는 이러한 정기적 인 업데이트 작업의 성능을 떨어 뜨리고 있습니다.

ObjectTrackingEnabled를 false로 설정했는데 DataContext가 읽기 전용이므로 해당 항목이 나에게 유용하지 않습니다. 특히 문제는 업데이트의 성능과 관련이 있습니다.

업데이트 성능을 향상시킬 수있는 방법이 있습니까? 내가 DbLinq를 사용하는 것이 최적의 방법이 아닌데, 한 번의 제출으로 40-50 개의 삽입물과 80 개의 업데이트를 밀어 넣으려고하는 것입니까? 그렇다면이 문제를 해결할 더 좋은 방법이 있습니까?

+0

논리가 방해가되거나 코드를 보여 주어야합니다. 또는 최소한 현재 가지고있는 문제를 재현하는 간결한 예제를 제공해야합니다. 필자는 EF 4.1을 사용하여 mysql 데이터베이스에 추가로 약 18 개의 레코드를 전송하는 복잡한 입력 양식을 구성하고 대략 5 - 10 초가 걸린다. –

+0

장기간에 걸쳐 동일한 dataContext를 사용합니까? 즉, 일부 행을 읽거나, 일부 행을 업데이트/추가하고, 변경 사항을 제출 한 다음 동일한 dataContext로 반복합니까? – hatchet

+0

@hatchet - 이것이 OP에서 보냈다는 것을 알고 있지만 저장소에서 변경 사항을 저장할 때마다 변경 사항을 저장하고 전체 데이터 컨텍스트를 동일한 것으로 사용합니다. 그가 시간에 기여할 수있는 여러 번 연결을 열고 닫는 경우. 그러나 어떤 종류의'n! '연산이 발생하는 것처럼 보입니다. –

답변

1

데이터를 읽고 수정하고 변경 사항을 제출 한 다음 동일한 DataContext 개체를 반복하여 수명이 긴 DataContext를 사용하면 성능에 부정적인 영향을 줄 수 있습니다. DataContext가 엔티티를 구체화하면 개체 추적의 일부로 DataContext의 수명 동안 내부적으로 유지합니다. 시간이 지남에 따라이 내부 캐시는 커질 수 있으며, 일부 경우 데이터베이스의 많은 부분에서 메모리 내부 캐시가 될 수 있습니다. 이는 작업 속도를 늦추고 SubmitChanges 동안 DataContext에 대한 더 많은 작업을 유발할 수 있습니다.

DataContext는 수명이 짧아야합니다. 수명은 일의 단위 여야합니다. 그것을 만들고, 무언가를 위해 그것을 사용하고, 그것을 처분하십시오.

Why would reusing a DataContext have a negative performance impact?

이 제품에 가까운 사람 :

http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/04/27/lifetime-of-a-linq-to-sql-datacontext.aspx

긴 수명 사용 : DataContext를 자체가을 덮어 쓰지 않습니다 여기

좀 더 세부입니다 개체를 쿼리를 통해 검색하면 개체가 반환됩니다. 따라서 시간이 지남에 따라 검색된 개체는 자주 변경되는 경우 오래된 개체가 될 수 있습니다.

SubmitChanges() 후 DataContext는 SubmitChanges() 이후에 사용할 수 있지만주의해야합니다. SubmitChanges()는 개체 그래프에 대한 모든 변경 사항을 파악하는 데 많은 어려움이 있습니다. 그것은 당신을 위해 CUD 작업을 명령하고 각각의 변경된 개체의 입도로 낙관적 동시성 검사를 제공합니다.

관련 문제