Редактировать
Вы обновили свой вопрос, так как я впервые посмотрел на него. В этом примере я бы сказал, что вы обязательно должны всегда использовать
SELECT user_id FROM users WHERE user_email = ''
Не
SELECT user_id FROM users WHERE LEN(user_email) = 0
Первый позволит использовать индекс. В качестве оптимизации производительности это превзойдет некоторую строковую микрооптимизацию каждый раз! Чтобы увидеть это
SELECT * into #temp FROM [master].[dbo].[spt_values]
CREATE CLUSTERED INDEX ix ON #temp([name],[number])
SELECT [number] FROM #temp WHERE [name] = ''
SELECT [number] FROM #temp WHERE LEN([name]) = 0
Планы выполнения
![Execution Plans](https://i.stack.imgur.com/uzCoO.png)
Оригинальный ответ
В приведенном ниже коде (SQL Server 2008 - я «позаимствовал» временную структуру из ответа @ 8kb здесь ) я получил небольшое преимущество для проверки длины, а не содержимого ниже, когда содержалось @stringToTest
строка. Они были равны по времени, когда NULL. Я, вероятно, недостаточно проверял, чтобы сделать какие-то твердые выводы.
В типичном плане выполнения я бы предположил, что разница будет незначительной, и если вы будете проводить такое большое сравнение строк в TSQL, что это, вероятно, будет иметь какое-то существенное значение, вам, вероятно, следует использовать другой язык для него. 1030 *
DECLARE @date DATETIME2
DECLARE @testContents INT
DECLARE @testLength INT
SET @testContents = 0
SET @testLength = 0
DECLARE
@count INT,
@value INT,
@stringToTest varchar(100)
set @stringToTest = 'jasdsdjkfhjskdhdfkjshdfkjsdehdjfk'
SET @count = 1
WHILE @count < 10000000
BEGIN
SET @date = GETDATE()
SELECT @value = CASE WHEN @stringToTest = '' then 1 else 0 end
SET @testContents = @testContents + DATEDIFF(MICROSECOND, @date, GETDATE())
SET @date = GETDATE()
SELECT @value = CASE WHEN len(@stringToTest) = 0 then 1 else 0 end
SET @testLength = @testLength + DATEDIFF(MICROSECOND, @date, GETDATE())
SET @count = @count + 1
END
SELECT
@testContents / 1000000. AS Seconds_TestingContents,
@testLength / 1000000. AS Seconds_TestingLength