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
подходом