COALESCE и IS NOT NULL производительность при проверке пустой строки - PullRequest
6 голосов
/ 14 октября 2010

Некоторые статьи, которые я нашел в интернете, сравнивали ISNULL с COALESCE, поэтому я думаю, что мой вопрос немного отличается.

Мне интересно, что лучше с точки зрения производительности ?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

Или

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';

Кроме производительности, есть ли другие вопросы, которые я должен учитывать при принятии решения?

EDIT:

Я использую Teradata.

Ответы [ 2 ]

7 голосов
/ 14 октября 2010

Эта версия немного более понятна и позволяет (потенциально) использовать индекс

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

Может быть упрощено до

SELECT * FROM mytable WHERE mycolumn <> '';

Причина, по которой я говорю "слегка" и "потенциально", заключается в том, что предикат неравенства вполне может означать, что вы все равно закончите с полным сканированием.

1 голос
/ 14 октября 2010

Вы также можете использовать ANSI_NULL ON настройку . Это неявно отфильтровывает нулевые значения в столбце, где вы вводите аргумент поиска. Это упрощает ваш запрос, я не уверен, что это сделает его быстрее. Тем не менее, логически теоретически это следует делать, поскольку необходимо оценивать меньшее количество аргументов фильтра и не использовать функции в предложении where, которые должны обеспечивать полную селективность индекса. В качестве примера вы можете изменить свой запрос следующим образом:

SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';

Надеюсь, это поможет.

...