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

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

4

1 回答 1

3

我猜你在 phone 列中有 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).

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

于 2011-08-26T08:05:49.153 回答