2010-07-28 52 views
26

我聽說在某些編程語言中,檢查字符串的長度是否爲0比查看內容是否爲""要快。這對於T-SQL也是如此嗎?檢查length = 0的速度比將其與空字符串進行比較更快嗎?

樣品:

SELECT user_id FROM users WHERE LEN(user_email) = 0 

SELECT user_id FROM users WHERE user_email = '' 
+0

親愛的ESPO你沒有聽錯,之所以被串在編程實現語言作爲類和長度是這個類的變量。因此訪問一個變量比運行一個函數來得到答案要快。在sql中你必須調用函數來獲得比與空字符串或null比較慢的長度。 – 2013-01-23 09:30:13

回答

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 

執行計劃

Execution Plans

原來的答案

在下面的代碼(SQL Server 2008中 - 我 「借用」 從@8kb's answer here時機框架)我有當@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 
5

我只是測試它在非常有限的情況下和執行計劃非常輕微有利於比較它與一個空字符串。 (49%至51%)。這與內存中的東西有關,但如果與表中的數據進行比較,它可能會有所不同。

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

SELECT 
    1 
WHERE 
    @testString = '' 

SELECT 
    1 
WHERE 
    LEN(@testString) = 0 

編輯:這是與SQL Server 2005

7

我會小心的WHERE條款使用LEN,因爲它可能導致表或索引掃描。

還要注意的是,如果該字段是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 
+0

+1我剛剛也注意到了。 – 2010-07-28 08:36:37