문제

다음 쿼리가 매달려 있습니다.

설명 테이블을 잘 보이게하는 방법을 모르겠습니다. 누군가 나에게 말하면, 나는 그것을 정리할 것이다.

select
sum(grades.points)) as p,  
from assignments 
left join grades using (assignmentID) 
where gradeID IN 

(select grades.gradeID 
from assignments 
left join grades using (assignmentID) 
where ... grades.date <= '1255503600' AND grades.date >= '984902400' 
group by     assignmentID order by grades.date DESC);

문제는 1 학년 테이블에 문제가 있다고 생각합니다. 많은 행이있는 유형은 원인 인 것 같습니다. 모든 것이 색인화됩니다.

테이블을 이미지로 업로드했습니다. 서식을 올바르게 얻을 수 없었습니다.http://imgur.com/ajx34.png

의견 제시자는 Full Where 절을 원했습니다.

explain extended select count(assignments.assignmentID) as asscount, sum(TRIM(TRAILING '-' FROM grades.points)) as p, sum(assignments.points) as t 
from assignments left join grades using (assignmentID) 
where gradeID IN 
(select grades.gradeID from assignments left join grades using (assignmentID) left join as_types on as_types.ID = assignments.type 
where assignments.classID = '7815' 
and (assignments.type = 30170 ) 
and grades.contactID = 7141 
and grades.points REGEXP '^[-]?[0-9]+[-]?' 
and grades.points != '-' 
and grades.points != '' 
and (grades.pointsposs IS NULL or grades.pointsposs = '') 
and grades.date <= '1255503600' 
AND grades.date >= '984902400' 
group by assignmentID 
order by grades.date DESC);
도움이 되었습니까?

해결책

실제 데이터베이스 (예 : MySQL을 제외한 모든 데이터베이스이지만 Postgres를 예제로 사용)를 사용한다고 가정 해보십시오.

SELECT * FROM ta WHERE aid IN (SELECT subquery)

실제 데이터베이스는 하위 쿼리를보고 해당 RowCount를 추정합니다.

  • RowCount가 작다면 (예 : 수백만 미만)

하위 쿼리를 실행 한 다음 Memory Inmory 해시를 구축하여 IN의 특징 인 고유 한 ID를 만듭니다.

그런 다음 TA에서 가져온 행의 수가 TA의 작은 부분이라면 적절한 인덱스를 사용하여 행을 당깁니다. 또는 테이블의 주요 부분이 선택되면 완전히 스캔하고 해시에서 각 ID를 조회하면 매우 빠릅니다.

  • 그러나 하위 쿼리로 카운트가 상당히 큰 경우

데이터베이스는 아마도 하위 퀘스트에 고유 한 정렬+를 추가하여 병합 조인으로 다시 작성할 것입니다.

그러나 MySQL을 사용하고 있습니다. 이 경우,이 중 어느 것도 수행하지 않을 것입니다 (테이블의 각 행에 대한 하위 퀘스트를 다시 실행할 것입니다). 1000 년이 걸립니다. 죄송합니다.

다른 팁

"견딜 수없는 속도"를 참조하십시오.http://www.artfulsoftware.com/infotree/queries.php#568

매우 지저분하지만 : (모두의 도움에 감사드립니다)

   SELECT * 
   FROM grades
   LEFT JOIN assignments ON grades.assignmentID = assignments.assignmentID
   RIGHT JOIN (

   SELECT g.gradeID
 FROM assignments a
 LEFT JOIN grades g
 USING ( assignmentID ) 
 WHERE a.classID =  '7815'
 AND (
 a.type =30170
 )
 AND g.contactID =7141
  g.points
 REGEXP  '^[-]?[0-9]+[-]?'
 AND g.points !=  '-'
 AND g.points !=  ''
 AND (
 g.pointsposs IS NULL 
 OR g.pointsposs =  ''
 )
 AND g.date <=  '1255503600'
 AND g.date >=  '984902400'
 GROUP BY assignmentID
 ORDER BY g.date DESC
 ) AS t1 ON t1.gradeID = grades.gradeID

하위 쿼리가 별도로 실행될 때 정상적으로 작동하는 경우 다음과 같이 가입 대신 조인을 사용해보십시오.

select count(assignments.assignmentID) as asscount, sum(TRIM(TRAILING '-' FROM grades.points)) as p, sum(assignments.points) as t 
from assignments left join grades using (assignmentID) 
join
(select grades.gradeID from assignments left join grades using (assignmentID) left join as_types on as_types.ID = assignments.type 
where assignments.classID = '7815' 
and (assignments.type = 30170 ) 
and grades.contactID = 7141 
and grades.points REGEXP '^[-]?[0-9]+[-]?' 
and grades.points != '-' 
and grades.points != '' 
and (grades.pointsposs IS NULL or grades.pointsposs = '') 
and grades.date <= '1255503600' 
AND grades.date >= '984902400' 
group by assignmentID 
order by grades.date DESC) using (gradeID);

당신의 질문에 답할 수있는 정보가 충분하지 않으며, 당신은 ... Where 조항의 중간에 이상한 것입니다. 테이블이 얼마나 크고 인덱스는 무엇입니까?

IN 절에 너무 많은 용어가 있다면 성능이 심각 해지는 것을 볼 수 있습니다. IN의 사용을 올바른 조인으로 교체하십시오.

우선, 테이블 AS_TYPES in 절에서는 사용되지 않습니다. 왼쪽 합류는 목적이 없으므로 제거하십시오.

이는 외부 쿼리에서 과제 및 등급 테이블 만있는 내 절을 남겨 둡니다. 분명히 수정 할당은 외부 쿼리의 WHERE 절에 속합니다. 당신은 모든 곳을 움직여야합니다 등급 = 무엇이든 왼쪽 조항의 ON 절로 등급으로.

쿼리는 따라 가기가 조금 어렵지만 하위 쿼리가 전혀 필요하지 않은 것으로 생각됩니다. 쿼리가 기본적으로 다음과 같은 것 같습니다.

SELECT FOO()
FROM assignments LEFT JOIN grades USING (assignmentID)  
WHERE gradeID IN 
(
SELECT grades.gradeID
FROM assignments LEFT JOIN grades USING (assignmentID)  
WHERE your_conditions = TRUE
);

그러나, 당신은 하위 쿼리의 Where 절에서 정말 멋진 일을하지 않습니다. 나는 더 비슷한 것을 의심합니다

SELECT FOO()
FROM assignments LEFT JOIN grades USING (assignmentID)  
GROUP BY groupings
WHERE your_conditions_with_some_tweaks = TRUE;

도 잘 작동합니다.

여기에 핵심 논리가 누락되면 다시 주석을 주시면이 게시물을 편집/삭제하겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top