2011-08-26 3 views
1

최적화 할 SQL 쿼리가 있습니다."not in"쿼리를 최적화하는 데 도움이 필요합니다.

SELECT * 
FROM QUEUE_SMS_ALERT Q1 
where ALERT_ORIGIN = "FOO" 
AND RECORD_ID is null 
and PHONE NOT IN (
    SELECT DISTINCT PHONE 
    FROM QUEUE_SMS_ALERT Q2 
    where Q2.ALERT_ORIGIN = "BAR" 
); 

는 기본적으로 ALERT_ORIGIN이 ALERT_ORIGIN "BAR"와 같은 테이블에 대응하는 행이없는 "FOO는"모든 행을 얻을 필요가있다. 테이블에는 abt 17000 개의 행이 있으며 ALERT_ORIGIN "BAR"이있는 abt 1000 레코드 만 있습니다. 그래서 내 쿼리는 나를 abt 16000 행을 제공하기로되어 있습니다.

편집 : 현재 쿼리가 매우 느립니다. 현재 색인이 없습니다.

+1

색인, 키 등이 있습니까? 지금 천천히? PHONE을 사용할 수 있습니까? – gbn

+1

은'... 전화 NOT IN (DISTINCT 전화를 SELECT'PHONE' – Bohemian

+2

'컬럼에 인덱스를 넣어 ALERT_ORIGIN'와 고려 그리고 당신은에서'DISTINCT'을 제거 할 수 있습니다 ...', 필요하지 않을 것. –

답변

3

나는 당신이 (그래서 "최적화"없습니다 "수정"것) 작동하지 않습니다 NOT IN을 의미 전화 열에 NULL 값이 같은데요. 그래서 나는 NOT EXISTS로 글을 썼습니다 :

SELECT * 
FROM QUEUE_SMS_ALERT Q1 
WHERE 
    Q1.ALERT_ORIGIN = 'FOO' 
    AND 
    Q1.RECORD_ID is null 
    AND 
    NOT EXISTS (SELECT * 
     FROM QUEUE_SMS_ALERT Q2 
     WHERE 
      Q2.ALERT_ORIGIN = 'BAR' 
      AND 
      Q1.PHONE = Q2.PHONE) 

"잘못된"것이 아니라 느린 경우 색인을 사용해야합니다. 너 지금 무엇을 가지고 있니? 이 쿼리의 경우 (ALERT_ORIGIN, PHONE, RECORD_ID)에 대한 인덱스가 필요합니다.

참고 : 문자열 구분 기호에는 작은 따옴표를 사용하십시오.

+0

왜 인덱스 제안에'RECORD_ID'를 포함 시켰습니까?이 열은 NULL 일 수 있습니다.이 인덱스는이 쿼리에 덜 유용 할 수 있습니다. –

+0

@a 'SQL (Oracle, SQLServer, MySQL 등) R :..! 그것은 WHERE 절에서의 NULL을 너무 색인 – gbn

+0

덕분에 많은 ... 인덱스 – Shreyas

관련 문제