2012-12-07 2 views
1

엔티티 프레임 워크 (.NET 3.5와 함께 v1)를 사용하는 프로젝트가 있습니다. 몇 년 동안 사용되었지만 더 많은 사람들이 사용하고 있습니다. 시간 초과 오류가 발생하기 시작하여 몇 가지 사항을 추적했습니다. 간단히하기 위해 데이터베이스에 product, part 및 product_part 테이블 세 개가 있다고 가정 해 보겠습니다. ~ 1400 개의 부품과 소수의 제품이 있습니다.데이터베이스 블록으로 인한 Entity Framework 시간 초과 오류

사용자는 제품에 원하는 개수의 부품을 추가 할 수 있습니다. 내 문제는 제품에 많은 부품이 추가되면 삽입 시간이 오래 걸리는 것입니다. 나는 그것이 대부분 네트워크 트래픽/지연 때문이라고 생각하지만 1400을 모두 삽입하는 데는 약 1 분 정도 걸린다. 레코드가 삽입되는 동안 누군가가 들어가서 파트의 세부 사항을 보려고하면 타임 아웃이 발생하고 SQL Server의 활동 모니터에서 블록을 볼 수 있습니다.

이 문제를 방지하려면 어떻게해야합니까? 이 사과가 전에 부탁 받았을 때 사과했다.

감사합니다,

답변

1

나는 루트에 문제가 쓰기 트랜잭션이 너무 오래 걸리는 것을 생각합니다. EF는 대량 DML을 실행하는 데 적합하지 않습니다. 별도의 네트워크 왕복 및 별도 명령문에서 각 삽입을 실행합니다.

1400 개의 행을 삽입하고 성능 문제가있는 경우 TVP (INSERT ... SELECT * FROM @tvp)를 사용하여 하나의 명령문에 삽입하십시오. 또는 일괄 복사로 전환하지만 1400 행에서만 유리하다고 생각하지 않습니다.

읽기 트랜잭션이 차단되고 이것이 문제가되는 경우 스냅 숏 격리를 켭니다. 독자는 스냅 샷 격리로 차단하지 않으므로 독자를 100 % 돌볼 수 있습니다.

+0

도움을 주셔서 감사합니다. 정말 고맙습니다. 나는 TVP에 대해 들어 보지 못했지만 클라이언트가 2005 년을 사용하기 때문에 사용할 수없는 것으로 나타났습니다. 그들은 내년에 업그레이드 중입니다. 스냅 샷 격리 기능을 설정하는 방법에 대해서는 DBA와상의해야하지만, 지금은 대량 삽입 경로로 이동하겠습니다. 썰매 망치로 작은 못을 운전하는 것과 같은 느낌입니다. 나는 이것을 사용하고있다 - http://elegantcode.com/2012/01/26/sqlbulkcopy-for-generic-listt-useful-for-entity-framework-nhibernate/ – nickfinity

+0

멍청한 후속 질문. Management Studio에서 1400 개의 insert 문을 실행하면 테이블을 잠급니다. 차이점은 무엇입니까? – nickfinity

+0

테이블을 잠그지 않고 개별 행을 잠급니다. 두 경우 모두! 거기에는 차이가 없습니다. SSMS는 앱처럼 클라이언트입니다. – usr