需要有关优化“不在”查询的帮助

时间:2011-08-26 08:00:01

标签: sql self-join

我有一个SQL查询,我希望优化。

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为“FOO”的所有行在ALERT_ORIGIN“BAR”的同一个表中没有相应的行。该表包含abt 17000行,并且ALERT_ORIGIN“BAR”只有大约1000条记录。所以我的查询应该给我16000行。

编辑:当前查询非常慢。我目前没有任何索引。

1 个答案:

答案 0 :(得分:3)

我猜你在电话栏中有NULL值,这意味着NOT IN不起作用(所以它的“修复”不是“优化”)。所以我用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)上的索引。

注意:对字符串分隔符使用单引号