2009-10-18 4 views
1

수행 할 데이터 분석이 있습니다. 평균적으로 이는 50K-150K 행의 어딘가에 포함됩니다. 이 행에서 5 가지 기준에 따라 Sum (X) 및 Count (X)의 합계를 추출해야합니다. 여기에는 두 가지 방법이 있습니다 :SQL Server 또는 .NET에서 데이터 분석 수행?

  1. 각각 10 개의 다른 쿼리를 작성합니다. 각 쿼리는 Sum() 또는 Count()를 사용하여 열 X의 데이터를 집계하도록 설계되었습니다. 각각을 실행하고 SqlCommand.ExecuteScalar()를 사용하여 결과를 검색하십시오.
  2. 다른 조건을 평가하는 데 필요한 다양한 매개 변수를 모두 포함하는 사용자 지정 개체를 만듭니다. SqlCommand.ExecuteDataReader()를 사용하여 모든 다른 조건부 하위 집합을 포함하는 수퍼 집합을 만드는 데 필요한 모든 데이터를 반환하는 쿼리를 하나만 실행합니다. DataReader의 각 행을 새 개체로 읽어 각 개체를 List 컬렉션에 추가합니다. 하나의 모든 데이터가 검색되고 Linq-to-Object를 사용하여 다른 조건에 따라 필요한 다른 Sum() 및 Count() 값을 결정합니다.

나는 어느 것이 가장 빠르는지 알아보기 위해 노력할 수 있음을 알고 있지만 어느 것이 더 빠를지에 대한 커뮤니티의 조언에 관심이 있습니다. SQL Server와 Web Server가 각각 자신의 컴퓨터에서 실행되고 각각 충분한 메모리가 있다고 가정합니다.

지금 나는 옵션 1에 기대고 있습니다. DB에 더 많은 쿼리가 있지만 DB 자체가 모든 집계 작업을 수행하고 SQL Server와 웹 서버간에 데이터가 거의 전달되지 않습니다. 옵션 2를 사용하면 단 하나의 쿼리 만 있지만 대용량의 데이터를 .Net으로 전달합니다. 그런 다음 .Net은 집계 함수와 관련하여 모든 무거운 작업을 수행해야합니다. SQL Server가 이러한 유형의 큰 집계 함수를 실행하는 데 더 효율적이라고 생각합니다.)

어떤 방법으로 가고 싶은 생각이 있습니까 (아니면 내가 놓친 세 번째 옵션)?

+0

이 일회성 것입니다, 또는 당신이 그것을 반복해야합니까? 그것을 반복해야 할 경우 쿼리가 전혀 변경되지 않습니까? 다른 날짜 범위 등? – DOK

+0

반복해야합니다. 반복 될 필요가있을 때마다 집계 및 필터링을위한 중요한 열의 열 이름이 변경되므로 SQL을 다시 생성해야합니다 (LinqToSql은 옵션이 아니므로). –

답변

1

데이터베이스는 일반적으로 이와 같은 데이터를 분석하기위한 최선의 옵션이며, # 1로 갈 것입니다.

그러나 SQL (10 대신)에 전달하는 단일 쿼리를 만드는 세 번째 옵션도 고려할 것입니다. 이는 CASE 문을 집계 함수에 넣는 것을 포함 할 수 있으므로 데이터의 단일 단계에서 모든 작업을 수행 할 수 있습니다.

는 PIVOT 일을 옛날 방식을 고려 :

SELECT 
    SUM(CASE WHEN ConditionX = 1 THEN SomeField END) AS SUM1 
    SUM(CASE WHEN ConditionX = 2 THEN SomeField END) AS SUM2 
FROM SourceData 
; 
+0

나는 동의 할 것이다, 제 3의 선택권은 아마가는 제일 방법이다; OP가 샘플 데이터를 제공 할 수 있다면 확실하게 말할 수 있습니다.언제든지 다른 열에서 같은 일을하는 x 개의 쿼리를 작성해야한다고 들었을 때, 그 수를 줄이는 방법에 대해 궁금해하기 시작합니다. –

1

너도 알다시피, 나는 옵션 1과 함께 갈거야. 50-150k 행 정말 많은 행을 IMO가 아니에요, 특히 당신이 너무 많은 열을 가지고 있지 않다면.

수백만 건의 이야기를 시작하면 최적화에 대해 생각하기 시작합니다.

또 다른 사항 : 항상 데이터베이스와 마찬가지로 쿼리가 인덱스에 올바르게 적용되는지 확인하십시오. 그것은 두 가지 아이디어의 차이보다 훨씬 중요합니다.