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 行が含まれており、ALERT_ORIGIN "BAR" を持つレコードは約 1000 しかありません。だから私のクエリは私に約16000行を与えるはずです。

編集: 現在のクエリは非常に遅いです。現在、インデックスはありません。

4

1 に答える 1

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)

注: 文字列の区切り文字には一重引用符を使用してください

于 2011-08-26T08:05:49.153 に答える