2011-08-26 234 views
1

我有一个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是“富”不具有相应的行中与ALERT_ORIGIN“BAR”同桌。该表包含abt 17000行,并且只有abt 1000条记录具有ALERT_ORIGIN“BAR”。所以我的查询应该给我abt 16000行。

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

+1

你有索引,键等吗?现在慢吗? PHONE是可空的吗? – gbn

+1

考虑将索引的列上'ALERT_ORIGIN'和'PHONE' – Bohemian

+2

你可以删除'DISTINCT'的'... PHONE NOT IN(SELECT DISTINCT电话......',这是没有必要的。 –

回答

3

我猜你在电话栏中有NULL值,这意味着NOT IN不起作用(所以它“修复”而不是“优化”)。所以,我有没有写它的存在:

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” R:!这是在WHERE子句中的NULL太索引 – gbn

+0

非常感谢......随着指数 – Shreyas