检查长度= 0是否比将其与空字符串进行比较更快?

Esp*_*spo 27 sql t-sql sql-server performance

我听说在某些编程语言中检查字符串的长度是否0比检查内容是否更快"".这对T-SQL也是如此吗?

样品:

SELECT user_id FROM users WHERE LEN(user_email) = 0
Run Code Online (Sandbox Code Playgroud)

SELECT user_id FROM users WHERE user_email = ''
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 27

编辑 自从我第一次看到它以来,您已经更新了问题.在那个例子中,我会说你绝对应该总是使用

SELECT user_id FROM users WHERE user_email = ''
Run Code Online (Sandbox Code Playgroud)

SELECT user_id FROM users WHERE LEN(user_email) = 0
Run Code Online (Sandbox Code Playgroud)

第一个将允许使用索引.作为性能优化,每次都会胜过一些字符串微优化!看到这个

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
Run Code Online (Sandbox Code Playgroud)

执行计划

执行计划

原始答案

在下面的代码中(SQL Server 2008 - 我从这里借用了@ 8kb答案的时序框架)我在测试长度方面略有优势,而不是@stringToTest包含字符串时的下面内容.NULL时,它们是相同的时序.我可能没有足够的测试来得出任何确切的结论.

在一个典型的执行计划中,我认为差异可以忽略不计,如果你在TSQL中进行那么多的字符串比较,它可能会产生任何显着的差异,你可能应该使用不同的语言.

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
Run Code Online (Sandbox Code Playgroud)


Stu*_*tLC 7

我会小心使用LEN一个WHERE子句,因为它可能导致表或索引扫描.

另请注意,如果字段NULL能够LEN(NULL) = NULL,那么您需要定义行为,例如:

-- Cost .33
select * from [table]
where itemid = ''

-- Cost .53
select * from [table]
where len(itemid) = 0

-- `NULL`able source field (and assuming we treat NULL and '' as the same)
select * from [table]
where len(itemid) = 0 or itemid is NULL
Run Code Online (Sandbox Code Playgroud)


Evi*_*eon 5

我只是在一个非常有限的场景中测试它,并且执行计划曾经稍微倾向于将它与空字符串进行比较.(49%至51%).这与内存中的东西有关,所以如果与表中的数据进行比较可能会有所不同.

DECLARE @testString nvarchar(max)
SET @testString = ''

SELECT
    1
WHERE
    @testString = ''

SELECT
    1
WHERE
    LEN(@testString) = 0
Run Code Online (Sandbox Code Playgroud)

编辑:这是与SQL Server 2005.