2013-12-22 3 views
0

첫 번째 코드는 MonetDB에서 실행할 수 없습니다 :다음 코드의 차이점은 무엇입니까?

SELECT rc0.id as runcat, x0.id as xrtcat 
    FROM extractedcatalog x0 
    INNER JOIN image i0 
      ON i0.id = 1 AND i0.id = x0.image 
    INNER JOIN runningcatalog rc0 
       ON rc0.zone BETWEEN x0.zone-1 
            AND x0.zone+1 
       AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj 
            AND x0.decl + i0.rb_smaj 
       AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(i0.rb_smaj)); 

연결이 종료!

하지만 다음 코드는 매우 빠르게 실행될 수 있습니다.

SELECT rc0.id as runcat, x0.id as xrtcat 
FROM extractedcatalog x0 
INNER JOIN image i0 
     ON i0.id = 1 AND i0.id = x0.image 
INNER JOIN runningcatalog rc0 
      ON rc0.zone BETWEEN x0.zone-1 
           AND x0.zone+1 
      AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj 
           AND x0.decl + i0.rb_smaj 
      AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(0.0055)); 

테이블 이미지에는 id = 1, rb_smaj = 0.0055라는 행이 하나만 있습니다. 대단히 감사합니다!

답변

0

유일한 차이점이 cos 인 경우이 숫자를 데이터베이스 필드로 저장하고 인덱스를 지정하십시오.() 한 번만 전체 쿼리에 대한

0

의 차이는 첫 번째 쿼리가 cos()에있는 모든 행 (즉 자격 행 수에 따라 실행 수백만 수)에 합류 실행하는이지만, 두 번째는 'COS를 실행 그래서 그것은 많이 더 빠릅니다.

첫 번째 쿼리가 cos()image의 행 당 라고 그래서, 단순히 시도 WHERE 절에 조건을 이동, 빠르게 실행하려면 다음

SELECT rc0.id as runcat, x0.id as xrtcat 
FROM extractedcatalog x0 
INNER JOIN image i0 
     ON i0.id = 1 AND i0.id = x0.image 
INNER JOIN runningcatalog rc0 
    ON rc0.zone BETWEEN x0.zone-1 AND x0.zone+1 
    AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj AND x0.decl + i0.rb_smaj 
WHERE rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z > cos(radians(i0.rb_smaj)) 

을 그 않은 경우 내부 쿼리를 작성하여 조건에 포함 된 열을 선택하고 cos() 결과를 얻은 다음 where 절을 추가하십시오.

+0

감사합니다. Bohermian, 이미지 테이블이 큰 경우 이미지 테이블이 1 행만 있습니다. 코드를 시도했는데 다음 번에 수행하는 방법을 알려줄 수 있습니까? 마지막 조건은 3 개의 테이블을 포함하고 내부를 만드는 방법입니다. 쿼리 조건에 관련된 열을 선택하려면? – user2706760

관련 문제