2012-03-12 4 views
0

그냥 SQL 쿼리를 최적화하려고합니다.GROUP BY 쿼리 최적화

SELECT Code, COUNT(*) 
FROM  tblData 
WHERE ListID = 380 
GROUP BY Code 

표에는 1,000 만 개의 레코드가 있습니다. 따라서 SQL SERVER 2008 R2에서 레코드를 찾으려면 대개 4-5 초가 걸립니다. 나는 그것을 표현하는 또 다른 방법을 찾았습니다 :

SELECT a.Code, COUNT(*) 
FROM ( SELECT * 
      FROM tblData 
      WHERE ListID = 380 
     ) a 
GROUP BY a.Code 

비록 내 테스트에서 정확히 같은 시간에 결과가 나옵니다. 그러나 이전 버전이 더 빠르거나 그 반대 일지 궁금합니다. 어떤 생각?

+2

색인을 생성하고 쿼리 플래너/분석기에서 무엇을 말합니까? – YXD

+0

그런데 * SQL Server 2010 * 같은 것은 없습니다. * 2010 년에 출시 된 SQL Server 2008 R2 *를 원하셨습니까? –

+0

네, 그 뜻이에요. 나는 실제로 그것의 버전이 10.50..lol 인 것을 혼동한다. 정정에 감사한다. –

답변

4

괜찮은 쿼리 최적화 프로그램을 사용하면 두 쿼리가 똑같은 동작을 수행해야합니다. 그래서 나는 그들이 같은 시간에 뛰는 것을 알면 놀라지 않을 것입니다.

더 빠르게 실행되도록 쿼리를 수정할 수 있다고 생각하지 않습니다. 물론, 할 수있는 일은 ListID에 대한 색인을 작성하는 것입니다.하지만 이미 그렇게 할 것으로 기대합니다.

+0

LISTID는 기본 키이며 따라서 이미 Index입니다. 그룹화되었으므로 Index on Code도 만듭니다. 하지만 여전히 프로젝트의 주 테이블이므로 최적화하고 싶습니다. –

+2

@Mitch에서 제안한'(ListID, Code)'에 대한 색인이 도움이 될 수 있습니다. 더 나아가, 나는 그것을 향상시키는 방법을 보지 못했다. 'ListID' 값이 극히 적고'tblData'를 여러 테이블로 분리하여 독립적으로 쿼리하면'where' 절을 피할 수 있습니다 (면책 조항 : 그것은 추한 것입니다!) – cornuz

+0

Okak, 비록 두 필드에 개별적으로 인덱스가 있지만 코드와 ListID의 조합에 대해 세 번째 인덱스를 만듭니다. 이렇게하면 쿼리가 1 초 미만으로 최적화됩니다. –

0

Management Studio에서 두 쿼리를 모두 선택하고 "예상 된 실행 계획 표시"를 클릭합니다. 하나의 쿼리 비용이 50 %와 다른 경우 승자 (및 패자)가 있습니다.

두 번째 쿼리는 분석기를 통과 한 첫 번째 쿼리의 결과로 표시됩니다. 나는 둘 다 똑같이 수행 할 것이라고 생각한다.

3

@cornuz와 @Wim 둘 다 말했듯이이 두 쿼리는 동일해야합니다.

그러나, 데이터베이스 그냥 인덱스가 아닌 테이블을 방문 할

  1. 때문에 (ListId 다음 코드에) 두 개의 열이 지수를 갖는 것은 성능을 상당히 향상시킬 것입니다 찾을 수 있습니다;
  2. 인덱스는 함께 계산해야하는 행 을 가져 오는 추가 정렬을 수행 할 필요가 없습니다.