2013-05-14 5 views
1
I 주문의 집합을 검색하는 데 사용되는 다음 쿼리를 데

의 촬영을 많이 :SQL 쿼리 최적화 : 시간

select count(distinct po.orderid) 
from PostOrders po, 
    ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
    and po.comp_code in (3,4) 
    and pro.orderid = po.orderid 

쿼리가 4323의 결과를 반환하고, 너무 빨리 충분하지 않습니다.

그러나 내가 쿼리에 추가 조건을 추가하는 또 다른 테이블 DiscarderOrders에없는 경우 난 만 반환하도록 다른 조건을 추가해야한다

select count(distinct po.orderid) 
from PostOrders po, 
    ProcessedOrders pro 
where pro.state IN ('PENDING','COMPLETED') 
    and po.comp_code in (3,4) 
    and pro.orderid = po.orderid 
    and po.orderid not in (select do.order_id from DiscardedOrders do) 

위의 쿼리가 많이 걸립니다 시간과 단지 계속 실행합니다. 빨리 실행되도록 쿼리에 할 수있는 것이 있습니까? 또는 첫 번째 쿼리를 먼저 실행 한 다음 다른 쿼리를 촬영하여 조건을 기준으로 필터링해야합니까?

+0

쿼리와 테이블 구조 모두에 대한 실행 계획, 열을에 당신이 인덱스를해야합니까를 제공하십시오? –

답변

3

당신은 대체를 시도 할 수 있습니다 :

and po.orderid not in (select do.order_id from DiscardedOrders do) 

JOIN보다 NOT IN

SELECT COUNT(DISTINCT po.orderid) TotalCount 
FROM PostOrders po 
     INNER JOIN ProcessedOrders pro 
      ON po.orderid = pro.orderid 
     LEFT JOIN DiscardedOrders do 
      ON po.orderid = do.orderid 
WHERE po.comp_code IN (3,4) AND 
     pro.state IN ('PENDING','COMPLETED') AND 
     do.orderid IS NULL 

또는 NOT EXISTS

를 사용하여 시도
and not exists (select 1 from DiscardedOrders do where do.order_id = po.orderid) 
+0

효과가있었습니다. 감사합니다. – Chillax

2

에 의해 0
SELECT COUNT(DISTINCT po.orderid) TotalCount 
FROM PostOrders po 
     INNER JOIN ProcessedOrders pro 
      ON po.orderid = pro.orderid 
WHERE po.comp_code IN (3,4) AND 
     pro.state IN ('PENDING','COMPLETED') AND 
     NOT EXISTS 
     (
      SELECT 1 
      FROM DiscardedOrders do 
      WHERE po.orderid = do.orderid 
     ) 
+0

JOIN이 반드시 'NOT IN'조건과 동일 할 필요는 없다고 추가 할 수 있습니다. 'DiscardedOrders'가 같은'orderid'를 두 번 이상 포함 할 수 있다면 (아마도 여기에서는 그렇지 않을 것입니다) –

0

동일 별개로 :

SELECT count(po.orderid) 
    FROM PostOrders po 
WHERE po.comp_code IN (3,4) 
    AND EXISTS 
    (
    SELECT 1 FROM ProcessedOrders pro 
    WHERE pro.orderid = po.orderid 
     AND pro.state IN ('PENDING','COMPLETED') 
    ) 
    .... 
/