2013-12-20 2 views
0

우리는 작업을 통해 성능 문제를 경험 한 나는 다행히 속도 저하의 원인이 쿼리를 찾을 수는 ..SQL Server 쿼리 perfomance에 의해 그룹과 튜닝 및 가입 조항

select name from Student a, Student_Temp b 
where a.id = b.id and 
a.name in (select name from Student 
group by name having count(*) = @sno) 
group by a.name having count(*) = @sno 
OPTION (MERGE JOIN, LOOP JOIN) 

이 특정 쿼리를 반복적으로 여러 번 둔화라고 성능을 낮추십시오.

Student 테이블에는 8 백만 개의 레코드가 있고 Student_temp은 매번 반복 프로세스에서 5-20 레코드를받습니다. Student 테이블에 복합 기본 키가 있습니다 (idname) 및 sno = Student_Temp에 레코드가 없습니다.

제 질문은 아래에 있습니다 : 1) 왜이 쿼리는 성능 문제를 표시합니까? 2) 여러분은이 작품을 더 효과적으로 쓸 수 있습니까?

미리 감사드립니다.

+0

당신도 확실하지가 필요 "및 a.name (이름을 가진 COUNT (*) = @sno에 의해 학생 그룹의 이름을 선택)에"일부 내 생각 – athabaska

+0

이동 당신은 내부 조인을 사용할 수 있습니다 : 학생 이름 선택 INNER JOIN Student_Temp b ON a.id = b.id ... – PeterRing

+0

하위 쿼리는 의미가 없습니다. – KumarHarsh

답변

1

동일한 논리가 불필요하게 반복됩니다. 당신은 정말 원하는 : 또한 Student_temp에 존재하는 학생 (들)

  • 어떤 이름 @sno 번 존재의

    • ?

    이 시도 :

    SELECT 
        name 
    FROM 
        Student a JOIN 
        Student_Temp b ON a.id = b.id 
    GROUP BY 
        name 
    HAVING 
        count(*) = @sno 
    
  • 1

    귀하의 쿼리는 다음 결과를 반환합니다 : 나에게 정확히 한 번만 Student_temp의 테이블 Student@sno 배와 모든 이름을 지정합니다.

    당신은이 같은 쿼리를 다시 작성할 수 있습니다 :

    SELECT a.name 
    FROM Student a 
    INNER JOIN Student_temp b 
    ON a.id = b.id 
    GROUP BY a.name 
    HAVING COUNT(*) = @sno 
    

    당신은 쿼리 힌트를 생략해야 당신이 절대적으로 확신하지 않는 한 그 쿼리 최적화 나사까지.

    편집 : 질의 차이가 당연히있다 : 다음 예를 @sno=2Student_temp 한 번 Student뿐만 두 번 나타 이름 내 쿼리가 아니라 원래에 포함 할 것인지. 나는 그것이 굳건히 할 필요가 있는지 없는지를 실제로 성취하기를 원하는 것에 달려 있습니다. 여기

    +0

    고마워요. 나는 질문이있다. 당신의 대답은 당신이 "모든 이름"으로주었습니다. 이것은 사실이 아닙니다. 값 a.name이 변수에 지정됩니다. like @ nm = a.name .... select 당신의 쿼리가 내 것과 정확히 같은 결과를 줄 것입니까? – Vignesh

    +0

    당신이 묻고있는 것이 확실하지는 않지만, 그렇습니다 : 쿼리는 둘 이상의 행을 반환 할 수 있습니다. – Twinkles

    +0

    팀에서 데이터베이스 경험을 가진 누군가를 얻는 것을 고려해보십시오. 시스템이 더 느려지는 문제 (예 : 쿼리가 "반복적으로 여러 번 호출되는 부분")가있을 수 있습니다. – Twinkles

    0

    당신은

    select name 
    from Student a 
    inner join Student_Temp b 
    on a.id = b.id 
    group by a.name 
    HAVING COUNT(*) = @sno