2016-12-01 1 views
0
select * 
from ((select 'Temp', r.* 
     from tab1 r 
     where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab2 r1) 
    ) union all 
     (select 'report', r.* 
     from tab2 r 
     where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab1 r1) 
    ) 
    ) temp 
order by fa; 

데이터가 증가함에 따라 쿼리 시간이 증가하고 있습니다. 데이터가 계속 증가하는 경우에도 시간을 최적화하기위한 솔루션을 제공하십시오.SQL에서 다음 쿼리 시간 최적화

+1

어떤 데이터베이스 시스템을 사용하고 있습니까? SQL Server, Oracle, MySQL 등 –

+0

my sql 작업 벤치 –

+1

쿼리 최적화 질문에 대한 관련 정보에는 현재 쿼리/최적화 계획, 기존 인덱스 및 대략적인 테이블 크기가 포함됩니다. –

답변

0

데이터 A + B - (a 교차 B). 그것을 위해서 당신은 1 개의 union과 2 개의 in not 절을 사용하고 있습니다. 다음 쿼리에서이를 제거하려고했습니다.

기본적으로 먼저 UNION 대신 UNION을 사용하여 모든 레코드를 선택해야합니다. 그 후 두 테이블 (tab1, tab2)에 나타난 레코드를 필터링하여 분석 함수를 사용할 수 있습니다. 당신의 쿼리

+0

제한 : 'OVER (PARTITION BY ...)'는 MariaDB 10.2에서만 사용 가능합니다. –

0

, 당신은 인덱스로 시작해야합니다

  • tab1(r.fa, r.date, r.status)
  • tab2(r.fa, r.date, r.status)

이것은 쿼리의 not in 부분을 가속화해야한다. order by 주위에 방법이 없습니다.

일반적으로 불필요한 하위 쿼리를 사용하면 추가 비용이 부과됩니다. 그러나 order by을 사용 중이므로 하위 쿼리가 성능 측면에서 차이를 만들지는 못합니다.

+0

cn u plz 정확한 쿼리 작성 –

0

WHERE (a,b) ...은 MySQL에서 잘 최적화 된 적이 없습니다. 구조를 피하십시오.

IN (SELECT ...)은 최근에 개선되었지만 여전히 EXISTS(SELECT * ...) 또는 LEFT JOIN .. ON ..만큼 좋지 않습니다. 재구성하십시오. SELECTsORDER BY을 가질 수

(SELECT ...) 
UNION ALL 
(SELECT ...) 
ORDER BY ... -- applies to UNION 

선택적 :

NOT IN

플러스 LEFT JOIN ... ON ... WHERE ... IS NULL

에 위의 재 공식화 할 수 있습니다 모두 당신은 외부 SELECT 필요가 없습니다, 당신은 UNION하여 정렬 할 수 있습니다 하지만 LIMIT 인 경우에만 유용합니다 (?).