我有一个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行。
编辑:当前查询非常慢。我目前没有任何索引。
答案 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)
上的索引。
注意:对字符串分隔符使用单引号