2017-11-10 11 views
0

다른 유형/ID의 데이터에 대해 존재하지 않는 회사 및 날짜의 테이블에서 데이터를 선택하려고합니다. 큰 테이블에서 특정 ID가 동일한 열에 존재하지 않는 데이터를 선택합니다. 쿼리 속도 향상

다른 방법을 넣어, 나는 wh_calc_id = 344이 같은 company_id/dates_id 조합이 곳 wh_calc_id = 368 존재하지 않는 경우 company_id, dates_id, daily_val를 원한다. 이들은 그것을 내 두 시도이다 Select rows which are not present in other table

:

시도 1 :

SELECT distinct on (company_id, dates_id) company_id, dates_id, daily_val 
FROM daily_data d1 
WHERE NOT EXISTS (
         SELECT 1    
         FROM daily_data d2 
         WHERE d1.company_id = d2.company_id 
           and d1.dates_id = d2.dates_id 
           and d1.wh_calc_id = 368 
           and d2.wh_calc_id = 368 
        ) 
    and d1.wh_calc_id = 344 

문제 :

나는 느슨하게이 예제를 다음과 같은거야 을 그것은 매우 느린 27 분

시도 2 ​​: [제거]

모든 하나 (거대한) 테이블 : COMPANY_ID의 INT (인덱스), dates_id의 INT (인덱스), wh_calc_id의 INT (인덱스), daily_val 숫자

내가 속도를 도움이 될 인덱스를 추가하는 열려있어 사물을 올렸지 만 색인은?

포스트 그레스 (10)

PS - 나는 그들이 완료하기 전에 두 쿼리를 죽일했다, 그래서 제대로 작성하는 경우 난 정말 모르겠어요. 바라기를 나의 설명은 돕는다.

+1

그것은 왼쪽으로 부엉이 이렇게 : (회사 id, dates_id) company_id, dates_id, daily_val FROM daily_data에서 구분 별개 d1 LEFT JOIN daily_data d2 ON d1.company_id = d2.company_id 및 d1.dates_id = d2.dates_id 및 d1.wh_calc_id = 368 및 d2.wh_calc_id = 368 d1.wh_calc_id = 344 및 d2.company_id는 NULL입니다. 그리고 열을 통해 사용할 인덱스를 만듭니다 : 테이블에 일일 데이터를 생성합니다 (company_id, dates_id, wh_calc_id); –

답변

0

I 생각하기 :

SELECT 
    d1.* 
from 
    daily_data d1 
LEFT JOIN 
    daily_data d2 
ON 
    d1.company_id  = d2.company_id 
    AND d1.dates_id = d2.dates_id 
    AND d2.wh_calc_id = 368 
    AND d1.wh_calc_id = 344 

where 
    and d1.wh_calc_id = 344 
    and d2.wh_calc_id is null 
0

내가 왼쪽으로 할 것입니다 이런 식으로 조인

SELECT distinct on (company_id, dates_id) company_id, dates_id, daily_val FROM daily_data d1 LEFT JOIN daily_data d2 ON d1.company_id = d2.company_id and d1.dates_id = d2.dates_id and d1.wh_calc_id = 368 and d2.wh_calc_id = 368 WHERE d1.wh_calc_id = 344 AND d2.company_id IS NULL;

을하고 사용하는 열을 통해 인덱스를 만들 :이 내가 원하는 것을

Create index on table daily_data (company_id, dates_id, wh_calc_id);

+0

은 내가 원하는 것을하지 않았다. – mountainclimber