我听说在某些编程语言中检查字符串的长度是0
是否更快,而不是检查内容是否为""
。这对T-SQL也是如此吗?
样品:
SELECT user_id FROM users WHERE LEN(user_email) = 0
VS
SELECT user_id FROM users WHERE user_email = ''
答案 0 :(得分:27)
修改强> 自从我第一次看到它以来,你已经更新了你的问题。在那个例子中,我会说你绝对应该总是使用
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
执行计划
原始答案
在下面的代码中(SQL Server 2008 - 我从“{3}}借用了”时序框架)当@stringToTest
包含字符串时,我测试长度而不是下面的内容有一点优势。 NULL时,它们是相同的时序。我可能没有足够的测试来得出任何确切的结论。
在一个典型的执行计划中,我认为差异可以忽略不计,如果你在TSQL中进行那么多的字符串比较,它可能会产生任何显着的差异,你可能应该使用不同的语言。< / p>
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
答案 1 :(得分: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
答案 2 :(得分:5)
我刚刚在一个非常有限的场景中对它进行了测试,并且执行计划曾经稍微倾向于将它与空字符串进行比较。 (49%至51%)。这与内存中的内容有关,因此如果与表中的数据进行比较可能会有所不同。
DECLARE @testString nvarchar(max)
SET @testString = ''
SELECT
1
WHERE
@testString = ''
SELECT
1
WHERE
LEN(@testString) = 0
编辑:这是SQL Server 2005。