RSS
 

SQL IN/NOT IN

25 Сен

В контексте MySQL на данный момент.

Есть все предпосылки полагать, что красивый и изящный оператор IN / NOT IN в SQL-запросе сильно неэффективен на больших таблицах по сравнению с прямым сравнением значений по индексам и в том числе в операциях INNER / LEFT JOIN, т.к. похоже, что IN / NOT IN действует простым перебором, что сильно удорожает его применение. Здесь грустный вздох.

Но что нехорошо, возможная на первый взгляд полноценная замена выражения, например:

SELECT
    table1.param
FROM
    table1
WHERE
    table1.param NOT IN (
        SELECT
            table2.param
        FROM
            table2
        WHERE
            table2.predicate
    )

на:

SELECT DISTINCT
    table1.param
FROM
    table1
LEFT JOIN
    table2
ON
    table2.param        = table1.param
WHERE
    NOT(table2.predicate)

тоже неэффективна, т.к. в отрицании предиката нужно для всех полей, участвующие в нем, дополнительно добавлять проверку на IS NULL, который сам неэффективен по быстродействию.

 Единственно остающийся вариант для промышленной замены IN — INNER JOIN временной таблицы.

 

Leave a Reply

 
*

 
 
Rambler's Top100