Должен ли я использовать не существует или оператор соединения для фильтрации NULL?

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  name 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

А также

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

Что эффективнее, какой анализ?


person user198729    schedule 22.02.2010    source источник
comment
зависит от вашей СУБД, ваших индексов и состояния вашей статистики. Предлагаю начать с того, что сообщить не всемогущему, какая СУБД, а также запустить для нее план объяснения...   -  person Mitch Wheat    schedule 22.02.2010


Ответы (2)


Предполагая, что задействованные значения столбца не могут быть NULL -

MySQL:

LEFT JOIN/IS NULL более эффективен, чем NOT EXISTS — читайте подробности в этой статье.

Оракул:

Они эквивалентны.

SQL-сервер:

NOT EXISTS эффективнее, чем LEFT JOIN/IS NULL - подробнее читайте в этой статье.

Постгрес:

Подобно Oracle, они эквивалентны.

Если у вас есть проблемы с тем, что значения столбца не могут быть нулевыми, все же используйте LEFT JOIN / IS NULL - помните, что означает LEFT JOIN. Эта ссылка может помочь .

person OMG Ponies    schedule 22.02.2010

Я действительно думаю, что вы должны профиль для такого вопроса. Это зависит не только от конкретного продукта базы данных, но теоретически это также может зависеть от перекоса ваших данных.

Однако! По умолчанию я бы сказал, напишите код, который наиболее четко выражает ваши намерения. Вы ищете employee записей без соответствующих eotm_dyn, поэтому самый понятный код IMO — WHERE NOT EXISTS. Вероятно, это не имеет значения, но я бы использовал SELECT 1 (а не SELECT name), так как name не важен в логике «без соответствующей логики eotm_dyn».

Когда у вас будет код, который выражает ваши намерения и работает, рассмотрите возможность оптимизации на основе профилирования.

person Marc Gravell    schedule 22.02.2010