2012-07-10 3 views
1

PostgreSQL 데이터베이스에서 대규모 테이블 (7,000,000 개의 새 행/일)에 대한 sql 쿼리 컬렉션을 실행 중이고 첫 번째 뷰에서 성능 문제가 발생하여 테이블을 생성하고 있습니다. 내가 사용하고있는 대부분의 명령은 다음 쿼리와 유사하다 :대형 테이블에서 SQL 조인 최적화

CREATE TABLE events_tb AS 

SELECT * 

FROM 
(SELECT column1, column2, column3, column4, column5 
FROM test_database_1 
WHERE column6 = 'value1' 
    AND date_column > '2012-07-01' 
    AND date_column < '2012-07-10' 
) a 

INNER JOIN (SELECT DISTINCT column1 FROM test_database_2) b 
     ON (a.column1 = b.column1); 

쿼리가 아주 큰 테이블에 대해 실행되고 있다는 사실을 설명하기 위해 문 위의 수집을 향상시킬 수있는 방법이 있나요?

+1

실행 계획을 알려주십시오. http://explain.depesz.com/에 업로드 된 'Explain Explained'로 선호됩니다. –

+1

"컬렉션"에 대해 언급하고 있지만 하나의 쿼리 만 보았습니까? –

답변

5

이 간단하고해야 빨리 :

CREATE TABLE events_tb AS 
SELECT column1, column2, column3, column4, column5 
FROM test_database_1 t1 
WHERE column6 = 'value1' 
AND date_column > '2012-07-01' 
AND date_column < '2012-07-10' 
AND EXISTS (
    SELECT 1 
    FROM test_database_2 t2 
    WHERE t2.column1 = t1.column1 
    ); 

당신이하고자했다 방법 새로 생성 된 테이블에 column1을 두 번 포함하면 오류 메시지가 나타납니다.

EXISTS semi-joinJOIN 또는 IN 표현식보다 빠릅니다. 첫 번째 검색에서 실행이 중지 될 수 있기 때문입니다. 이것은 검색어에있는 DISTINCT으로 판단 할 때 중복되는 것으로 특히 유용합니다.

2

나는 PostgreSQL을의 최적화에 대해 아무것도 몰라,하지만 당신은 IN (SELECT...) 구조로 INNER JOIN를 교체 시도 할 수 :

CREATE TABLE events_tb AS 

SELECT column1, column2, column3, column4, column5 

FROM test_database_1 

WHERE column6 = 'value1' 
    AND date_column > '2012-07-01' 
    AND date_column < '2012-07-10' 
    AND column1 IN (SELECT DISTINCT column1 FROM test_database_2) 
+1

'IN'으로 이동했기 때문에 'distinct'는 더 이상 필요하지 않습니다. 이것은 데이터가 무엇인지에 따라 성능을 향상 시키거나 악화시킬 수 있습니다. –

+1

PG에 뇌가 있으면 단순히 무시합니다. – biziclop

+0

'date_column'과'column6'에는 색인이 있습니까? –

관련 문제