2010-01-07 3 views
0

유형 2 데이터의 데이터베이스 테이블이 있는데 마지막으로 동기화 한 이후로 삭제 된 레코드를 찾고 싶습니다. date_fromdate_to 개의 열이 있고 원시 데이터의 ID 열은 object_id입니다. date_to<>null은 현재 존재하지 않으므로 같은 object_iddate_to=null을 가진 다른 레코드가 없으면 삭제 된 것입니다.유형 2 테이블에서 삭제 된 레코드를 효율적으로 찾습니다.

select * from data_t2 a 
where a.date_to > last_sync_date and a.date_to < current_date() 
and not exists (select * from data_t2 b 
       where b.date_to is null and b.object_id = a.object_id); 

하지만 분명히 그 터무니없이 비싼 것 :

나는 순진 구현이 같은 될 것이라고 생각합니다.

명백한 효율적인 방법이 있습니까? 나는 거기에 (또는 오히려, 내가 상대적으로 몇 가지 삭제 된 레코드가 있다고 가정하고, RDBMS 이외의 계산을 수행해야한다고 생각한다.) 그러나 나는 단지 만약을 대비해 질문했다.

감사합니다.

답변

1

쿼리 튜닝을 시작하기 전에 실제로 EXPLAIN을 실행하거나 다른 진단을 적용해야합니다. 그렇지 않으면 다시 쓰기가 계획을 어떻게 변경하는지 알 수 없습니다.

외부 조인으로 다시 작성할 수 있습니다. 차원 테이블 정말 크고, 제 열로 DATE_TO을 갖는 인덱스 및 DATE_TO가 NULL 갖는 행수가 있으면

SELECT * 
FROM  data_t2 a 
LEFT JOIN data_t2 b 
ON  a.object_id = b.object_id 
AND  b.date_to IS NULL 
WHERE  a.date_to > last_sync_date 
AND  a.date_to < current_date()  
AND  b.object_id IS NULL 

예 MySQL 용, 이것은 부질보다 훨씬 빠르다

SELECT * 
FROM  data_t2 a 
LEFT JOIN (
      SELECT object_id 
      FROM data_t2 b 
      WHERE b.date_to IS NULL 
     ) 
ON  a.object_id = b.object_id 
WHERE  a.date_to > last_sync_date 
AND  a.date_to < current_date()  
AND  b.object_id IS NULL 
+0

그래, 나는 조인으로 서브 쿼리를 돌릴 수 있다는 것을 알았고 나는 총 EXPLAIN 중독자이다. 이것은 매우 직설적입니다. 여기에 많은 도움이된다면 date_to에 인덱스를 추가하는 것이 완전히 합리적으로 들립니다. 이것은 좋은 출발점입니다. – Ken

관련 문제