2012-02-09 4 views
1

나는 일대 다 관계의 개체를 반환해야하는 asp.net 페이지가 있습니다. 즉, 불특정 다수의 데이터 행이 뒤 따르는 단일 헤더 행이 존재한다. 일반적으로 1 ~ 10 행이 있으므로 여기에 엄청난 양의 데이터를 다루지는 않습니다. 자주 호출되는 페이지입니다.SQL 쿼리에서 부모 - 자식 데이터 반환

OLE 공급자가 계층 적 데이터를 반환 할 수있는 SHAPE 명령을 지원하지만 SQLDataReader (ADO?)를 사용하고 있습니다. 지원하지 않는 ADDataReader를 사용하고 있습니다. 문제는 최고의 연습/최고의 성능은 무엇입니까?

  1. INNER JOIN을 쿼리에 포함하고 헤더와 데이터 행을 포함하는 단일 테이블을 반환합니다. 즉, 헤더가 첫 번째 행 이후의 모든 행에서 반복된다는 것을 의미합니다. 이것이 비정상적인 데이터 트래픽을 발생시키고 있습니까 아니면 숨겨진 최적화가 있습니까?
  2. SQLCommand.executeReader()를 두 번 호출하십시오. 하나는 머리글 행을 반환하고 다른 하나는 데이터 행의 가변 개수에 대한 호출입니다. 그러나 이로 인해 1 대신 2 개의 개별 쿼리를 발행하는 오버 헤드가 발생합니다.
  3. 대신 SHAPE를 지원하는 API를 사용하십시오.
  4. SQLCommand.executeReader()를 한 번만 호출하지만 2 개의 select 문을 포함하는 쿼리로 정확히 2 개의 데이터 집합을 반환합니다. 그런 다음 머리글 행을 처리 한 후 SQLDataReader.nextResult()를 호출합니다. 이것은 하나의 헤더 행이 있기 때문에 원래의 문제를 해결하기위한 좋은 아이디어 인 것 같습니다. 그러나 이것이 아닌 다른 상황이 있습니다.이 경우 # 4는 옵션이 아닙니다. 또한 데이터 액세스는 순차적이며 데이터 행을 사용하기 전과 후에 모두 내 애플리케이션에서 헤더를 사용해야합니다. 따라서 nextResult()를 호출하기 전에 헤더 행을 메모리 내 DataTable에 써야합니다.
+1

일반적으로 여러 번의 호출을 수행하지만 일반적으로 솔루션은 문제와 상황에 따라 다릅니다. 1 개의 쿼리 대 2 개의 쿼리가 걱정되는 이유가 있습니까? 나는 KISS 교장을 따르고 당신에게 가장 쉬운 것이 무엇인지, 필요할 경우 리팩터링을 할 것입니다. – Zachary

+1

Entity Framework를 가능한 옵션으로 고려할 수 있습니까? 이 데이터는 자주 변경됩니까? – SCB

+0

4 번째 옵션을 사용합니다. @ Zachary가 말한 것에 동의한다. 문제와 그 맥락에 달려있다. – AJP

답변

1

SHAPE에 대한 경험이 없으므로 성능이 좋은지 잘 모르겠습니다. 다른 세 가지 옵션 중 옵션 # 4는 데이터베이스로의 이동과 데이터 중복을 최소화하기 때문에 가장 효율적입니다.

관련 문제