2009-05-29 4 views
0

저는 C#으로 작성된 사내 ORM을 유지 관리하고 있으며 현재 eager-loading 메커니즘이 없습니다. 성능을 향상시키기 위해 열심히로드해야하기 때문에 지원을 위해 자체 코드를 작성해야합니다. (제 동료와 저는 ORM 도구에 대한 경험이 없으며, 기존의 이유로 인해 LinqtoSQL, Entity Framework 또는 Nhibernate와 같은 인기있는 도구를 사용할 수 없습니다.)내 eager-load 알고리즘 작성에 대한 조언이 필요합니다.

제 질문은, 열심히로드하는 SQL 문을 생성하는 가장 좋은 방법은 무엇입니까? 나는 그것에 대해 생각 두 가지 방법으로 올라와있다 - 4 개 테이블의 고전적인 예를 가정

- CustomerCategory 많은 고객 이있는 고객이 많은 주문 주문이 많은 OrderDetail

하고 나는 가정을 가지고 예를 들어 '2008-05-05'와 '2008-12-31'사이의 Order.OrderDate

방법 1 - 하나의 SQL을 생성하여 모든 4 개의 테이블의 데이터 (모두 내부 조인을 사용하여 각 테이블의 기본 키의 고유 한 조합에 대해 하나의 행을 얻습니다.) 이 SQL에 Where 조건을 적용 할 것입니다.

방법 2 - 주문 데이터를 먼저 가져오고 Order.OrderDate가 Order 테이블에서 나왔으므로이 SQL에 Where 조건을 적용합니다. 그런 다음이 쿼리의 결과를 기반으로 필요한 모든 Order ID 값을 알 수 있으므로이 값을 사용하여 주문 세부 정보 데이터를 검색합니다. 또한 필요한 모든 고유 고객 ID 값을 알고 있으므로 고객 테이블에서 데이터를 검색하는데도이 값을 사용하고 마지막으로 CustomerCategory에 대해 동일한 작업을 수행합니다. 이 방법을 사용하려면 4 개의 SQL 문이 필요합니다.

첫 번째 방법이 더 효율적이라는 것을 알 수 있지만 동료 중 한 명은 두 번째 방법이 4 개의 SQL 문을 사용하지만 쓰기 및 유지 관리가 더 쉽다고 지적했습니다.

이 문제에 대한 의견을 보내 주시면 감사하겠습니다. 감사합니다.

답변

0

먼저 도메인 모델이 잘못되었습니다. 개인적으로는 개체를 CustomerCategory으로 정당화 할 수 없습니다. 성능 관점에서 이해할 수 없기 때문입니다. 대부분의 경우 단일 고객 (그룹 포함)이 필요하지만 대부분의 고객은 한 번만 필요합니다. 푸른 달 그러나 모든 종류의 문제를 일으키는 항상 거기에있을 것입니다. 동일한 숫자가 OrderCustomer에도 적용됩니다.

자, 질문에. 일반적으로 데이터베이스를 왕복하는 횟수는 필요한 것보다 많은 데이터를 검색하는 비용으로 최소화해야한다고 생각합니다. 즉, 연결된 테이블 두 개에서 동시에 데이터를 선택하는 두 개의 큰 테이블 (long & wide)을 결합하면 성능이 저하 될 수 있으므로 조심하십시오.

나는 그것이 NHibernate에서 어떻게 이루어 졌는지 보길 권한다. 그것은 당신이 페어 전략 (join, select)을 각 association에 대해 지정할 수있게 해줍니다. one-to-one association이나 one-to-many 일 수 있습니다.

Microsoft SQL Server 2005 이상을 사용하는 경우 MARS을 사용하여 여러 개의 select을 하나의 일괄 처리에 쌓은 다음 하나의 SQL 명령 만 실행하는 개체의 전체 그래프를 수분 공급할 수 있습니다.

+0

도움 주셔서 감사합니다. 본인의 모델에 실제로 문제가 있음을 인정합니다. 우리는 그것을 들여다 보며 당신의 제안에 따라 nhibernate 을 볼 것입니다. – janem

관련 문제