2

최근에 나는 Clojure에 익숙해지고 있으며 필요할 때만 값을 계산하는 lazy sequence evaluation에 대해 즐겁게 생각한다.LIMIT 최적화 된 쿼리

나는 PostgreSQL DB에서 많은 작업을하고 있으며, LIMIT 절을 사용할 때 쿼리의 성능이 서로 다릅니다. 예를 들어 쿼리에 대한

SELECT * FROM(
    SELECT id FROM foo1 
    INTERSECT 
    SELECT id FROM foo2) AS subquery 
LIMIT 50 

이이 포스트 그레스는 먼저 전체 결과를 평가하고 단지 처음 50 개 행을 얻을 것을 제안

SELECT id FROM foo1 
INTERSECT 
SELECT id FROM foo2. 

같은 같은 실행 시간이있을 것이다. 이것은 DB 프로세스 데이터가 최종 답을 얻을 필요가 없으므로 게으름의 개념과 반대입니다. 그러나 다른 한편으로 쿼리를

SELECT * FROM foo1 INNER JOIN foo2 ON foo1.id=foo2.id LIMIT 50 

SELECT * FROM foo1 INNER JOIN foo2 ON foo1.id=foo2.id. 

보다 훨씬 더 좋은 성능을 누군가가 포스트 그레스 작업은 LIMIT의 게으름을 지원하는 알고 있나요?

+2

참고 :'LIMIT'를 ORDER'없이 BY' 거의 또는 전혀 의미가 없습니다. – wildplasser

+1

쿼리 계획이나 성능에 관한 질문은 *** 항상 *** 버전의 Postgres와 케이스의 정확한 테이블 정의를 포함하십시오. ['[postgresql-performance]'에 대한 태그 정보를 읽으십시오 (http://stackoverflow.com/tags/postgresql-performance/info). 인덱스와 제약 조건은 특히 중요합니다. –

+0

@wildplasser : 임의의 * 선택이 괜찮은 한, 'LIMIT'은 'ORDER BY'없이는 의미가 있습니다. 많은 신참자들이 세부 사항을 알지 못하기 때문에 여기에있는 질문과 같은 잘못된 검색어를 주로 보게됩니다. –

답변

1

처음에는 두 테이블 모두에서 id이 고유하지 않으면 쿼리는 이 아니며이 아닙니다. INTERSECTINNER 또는 OUTER JOIN과 다르게 처리합니다. 누락 된 핵심 단어 ALL은 차이를 훨씬 더 크게 만듭니다. ALL 옵션을 지정하지 않으면 Per documentation:

INTERSECT의 결과는 중복 행을 포함하지 않습니다. ALL을 사용하면 왼쪽 테이블에 m 중복이 있고 오른쪽 테이블에 n 중복이있는 행은 결과 집합에 min(m,n) 번 표시됩니다.

다른 한편으로는 조인은 데이트 계열을 생성합니다. 즉, 일치하는 중복을위한 행은 m*n입니다. 따라서 쿼리 계획은 동일한 코드 경로를 사용할 수 없습니다.

는 (독특한 id을 제외하고 여전히 동일하지) 이하 다른 결과를 얻을 대신 사용하려면 여기

SELECT id FROM foo1 
INTERSECT ALL -- don't fold dupes 
SELECT id FROM foo2 
LIMIT 50; 

SELECT * FROM foo1 JOIN foo2 USING (id) LIMIT 50; -- return single id column

a fiddle to play with (페이지 9.3.1)입니다. sqlfiddle.com의 버전은 꽤 오래되었습니다. 최신 버전으로 직접 테스트하십시오.

많게는 더 많은 시간과 지혜가 더 일반적으로 여러 주문에 의해 사용되는 조인의 최적화에 들어갔다. 내가 종종 INTERSECT을 사용하는 것은 종종 열등한 쿼리 계획을 산출하기 때문입니다. 9.3 페이지의 빠른 테스트에서 조인은 훨씬 빠른 인덱스 스캔을 사용하는 INTERSECT에서 순차 검색 만 얻을 수있었습니다. 9.4의 INTERSECT에 관한 뉴스는 알지 못합니다.

특히 고유 색인이 관련된 경우 개선 가능성이 있습니다. INTERSECT은 다른 작업만큼 인기가 없기 때문에 아무도 충분히 신경 쓰지 않았다고 생각합니다.내가 LIMIT와 함께 UNION ALL을 위해 아주 좋은 사용 사례의 알고

하지만, "지연 평가"수혜 :