2011-07-02 9 views
1

두 개의 테이블을 포함하는 세 개의 내부 조인이있는 SELECT 문이 있습니다. ON 및 WHERE 절에서 참조되는 열에 인덱스를 만드는 것 외에도 쿼리를 다시 작성할 때처럼 조인을 최적화하기 위해 할 수있는 다른 작업이 있습니까? 두 번 my_table에서 동일한 레코드를 선택하고 있기 때문에세 개의 테이블이 포함 된 내부 조인

SELECT 
    ... 
FROM 
    my_table AS t1 
INNER JOIN 
    my_table AS t2 
ON 
    t2.id = t1.id 
INNER JOIN 
    other_table AS t3 
ON 
    t2.id = t3.id 
WHERE 
... 

답변

0

당신은 아마 당신의 예에서 오류를 가지고, 당신은 정말 할 수있는 :

SELECT 
    ... 
FROM 
    my_table AS t1 
INNER JOIN 
    other_table AS t3 
ON 
    t1.id = t3.id 
WHERE 
... 

때문에 귀하의 예제 코드 T1 항상있을 것 t2.

하지만 ON으로 가정하십시오. t2.idX = t1.id; 당신의 질문에 대답하기 위해, 당신은 당신이 가지고있는 것보다 훨씬 더 좋은 성능을 얻을 수 없다. 당신은 그것들을 색인 할 수있다. 또는 당신은 더 멀리 가서 외래 키 관계로 정의 할 수있다. (이것은 성능 이득 측면에서 너무 많이하지 않을 것이다. 비 색인 대 그들을 색인하는 것).

대신에 where 절을 제한하는 것으로보고 싶을 수도 있습니다. 아마도 where 절이 유용 할지라도 인덱싱이 될 것입니다.

INNER JOINS가 아닌 WHERE EXISTS (세 테이블 모두에서 데이터를 선택할 필요가없는 경우)를 사용하여 쿼리를 작성할 수 있지만 성능이 거의 동일합니다 (중첩 된 쿼리 내부의 경우 제외) 여전히 레코드를 찾을 필요가 있기 때문입니다.

1

PostgreSQL config, VACUUM ANALIZE 및 모든 일반 최적화를 조정할 수 있습니다.

충분하지 않고 며칠을 보낼 수 있으면 postgresql wiki에 설명 된대로 구체화 된보기를 작성하는 코드를 작성할 수 있습니다.

0

In PostgreSQL. 대부분의 튜닝은 실제 쿼리에 적용되지 않습니다. 목표는 옵티마이 저가 선언적 쿼리를 실행하는 최선의 방법을 파악하고 프로그램에서이를 수행하는 방법을 지정하지 않도록 돕는 것입니다. 그것은 때때로 쿼리가 스스로 최적화 될 수 없거나 필요하지 않을 수도 있지만, 더 많은 레코드를 검색하지 않는 한 내가 인식하고있는 문제 영역이 전혀 없다는 것을 말하는 것이 아닙니다. 당신이 필요로하는 것보다 (나는 때때로 이것을 보았다).

할 일은 진공 분석을 실행하여 최적의 통계를 얻는 것입니다. 그런 다음 Explain 분석을 사용하여 예상 쿼리 성능을 실제와 비교하십시오. 이 시점에서 우리는 인덱스 등을 살펴볼 것입니다.이 쿼리에는 쿼리 수준에서 최적화해야하는 것이 없습니다. 그러나 where 절에서 실제 필터를 조사하지 않고 Explain Explain의 실제 출력을 제시하지 않으면 제안 할 수있는 것이 많지 않습니다.

일반적으로 쿼리에서 쿼리를 지정하는 대신 데이터베이스를 조정하여 더 나은 쿼리 계획을 선택합니다. 그것은 대개 PostgreSQL 방식입니다. 주석은 물론 예외가 있음을 지적함으로써 자격이 부여됩니다.

관련 문제