Для проверки на NULL или 0 - PullRequest
       9

Для проверки на NULL или 0

5 голосов
/ 21 октября 2010

Что быстрее в SQL, чтобы проверить значение для NULL или 0

Я хочу, чтобы самый быстрый способ проверить это значение уже в таблице.

Например, который быстрее:

IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) is null )
BEGIN
....
END
ELSE
BEGIN
....
END

или

IF ((SELECT COUNT(ID) FROM [SomeTable].[dbo].[BlockedSubscriberNumbers]
     WHERE VALUE = @myVal) > 0 )
BEGIN
....
END
ELSE
BEGIN
....
END

Также играет роль в T-SQL, играет роль, где должен быть частый случай накопления. Я имею в виду, что это будет быстрее, что в большинстве случаев он потерпит неудачу в блоке IF, и медленнее, если он в основном перейдет в ELSE.

Ответы [ 6 ]

2 голосов
/ 21 октября 2010

Ну, на самом деле они будут делать разные вещи, вы не можете проверить, больше ли NULL в SQL.

Что вы должны сделать, это:

    IF (ISNULL((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
         WHERE VALUE = @myVal), 0) > 0 )
    BEGIN
    ....
    END
    ELSE
    BEGIN
    ....
    END

И вы действительно имели в виду равный 0?Поскольку ваш вопрос гласит

Что быстрее в SQL, чтобы проверить значение для NULL или 0

Эта часть относится к комментарию Джо о множественных результирующих наборах

Вы можете выполнить какую-либо агрегированную функцию над идентификатором выбора, используя ISNULL, чтобы определить, больше ли любое из значений, чем 0 (при условии, конечно, что все ваши значения больше 0).

Что касается выяснения, содержит ли какая-либо строка эту информацию согласно комментарию ОП

IF (Select Count(ID) from [SomeTable].[dbo].[BlockedSubscriberNumbers] Where Value = @myVal) = 0 Должен сказать, есть ли строки, содержащие это значение

Окончательное редактирование

Просто используйте Exists

If Exists(Select ID From [SomeTable].[dbo].BlockedSubscriberNumbers] Where Values = @myVal)

1 голос
/ 28 июня 2018

Для тех, кто хочет, чтобы это было внутри запроса, вы можете сделать что-то вроде:

SELECT ISNULL(NULLIF(primaryValue,0),secondaryValue) as Value FROM SomeTable

Здесь NULLIF вернет primaryValue как NULL, только если он уже равен NULL илиесли оно равно 0. ISNULL вернет secondaryValue, если primaryValue равно NULL.

Таким образом, если primaryValue равно NULL или 0, то оно вернет secondaryValue.

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

Проверка на NULL намного быстрее, чем проверка на 0, но я думаю, что для этих запросов мы говорим о разных вещах: они будут давать разные результаты.

0 голосов
/ 16 июня 2016
select (case when id is null or id=0
then (dothis) else (dothis) end) as idState 
from [SomeTable].[dbo].[BlockedSubscriberNumbers]
0 голосов
/ 07 мая 2012

EXISTS может быть быстрее, чем COUNT, особенно если строки, которые вы ищете, очень велики, и, кроме того, вы не должны слишком зацикливаться на микрооптимизации. В первую очередь стремитесь к удобочитаемости кода, чтобы другие, читающие ваш код, могли легко определить смысл вашего запроса. В любом случае, COUNT по-прежнему будет пытаться зациклить строки, даже если он уже найдет искомое значение. EXISTS - это указание вашей СУБД прекратить поиск, как только она соответствует вашим критериям.

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

EXISTS довольно оптимизирован

Это лучше как по удобочитаемости, так и по производительности:

IF EXISTS(SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) 
<Ч />

А следующее может привести ко многим строкам. Если по какой-либо причине многие строки в вашей таблице удовлетворяют фильтру, это приведет к ошибке:

IF ((SELECT ID FROM [SomeTable].[dbo].[BlockedSubscriberNumbers] 
     WHERE VALUE = @myVal) is null )

Единственный фактор выкупа при таком подходе к запросу - это если поле VALUE в вашей таблице является первичным ключом (но допустим, вы забыли поместить первичный ключ в эту таблицу), и оно возвращает две строки, что не приведет к беззвучному режиму ошибка, СУБД должна прекратить работу с ошибкой , и вы можете исправить ошибку раньше по сравнению с COUNT и EXISTS подходом

0 голосов

IMO, каждая запись / строка в таблице содержит NULL BITMAP (2 байта, каждый бит из которых говорит о нулевом значении одного / каждого значения столбца в этой строке) , поэтому перед выбором При считывании реального сохраненного значения этот процесс чтения данных проходит эту проверку / считывание соответствующего бита из этой битовой карты NULL.

В случае NULL (или, другими словами, проверки «не является нулевым»), процесс чтения останавливается на этом этапе, в то время как другие выбирает / проверяет / сравнивает может (или не зависит) продолжить, поэтому «проверка на ноль» не может быть медленнее. Более того, значения NULL в конце строки даже не сохраняются, они не занимают никакой памяти. Они практически, а иногда и практически ничего.

Хотя проблема в том, что ваши рассматриваемые примеры TSQL и сам вопрос неоднозначны с возможной множественной интерпретацией и ответами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...