2010-07-28 11 views
26

Bazı programlama dillerinde, içeriğin "" içeriğinin olup olmadığını kontrol etmek için bir dizenin uzunluğunun 0 olup olmadığını kontrol etmenin daha hızlı olduğunu duydum. Bu T-SQL için de geçerli mi?Boş bir dizeyle karşılaştırmak için length = 0 olup olmadığını kontrol etmek daha hızlı mı?

Örnek:

SELECT user_id FROM users WHERE LEN(user_email) = 0 

vs

SELECT user_id FROM users WHERE user_email = '' 
+0

Değerli espo sen neden dize programlama uygulanan ediliyor, doğru duymuş Bir sınıf ve uzunluk olarak diller bu sınıfın değişkendir. Bu nedenle, bir değişkene erişmek, cevabı almak için bir işlevi çalıştırmaktan daha hızlıdır.Sql'de boş dize veya null ile karşılaştırmadan daha yavaş olan uzunluk elde etmek için işlevi çağırmanız gerekir. –

cevap

27

Düzenleme İlk ona baktım beri sorunuzu güncelledik beraberdir. Bu örnekte ben kesinlikle her zaman

SELECT user_id FROM users WHERE user_email = '' 

Değil

SELECT user_id FROM users WHERE LEN(user_email) = 0 

İlki bir dizin kullanılacak sağlayacak kullanması gerektiğini söyleyebilirim. Bir performans optimizasyonu olarak her seferinde bazı dize mikro optimizasyonu koyacak! Bu

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 

Yürütme Aşağıdaki kodda

Execution Plans

Orijinal Cevap

Planları görmek için (SQL Server 2008 - Ben @8kb's answer here gelen zamanlama çerçevesi "ödünç") aldığım @stringToTest bir dizge içerdiğinde aşağıdaki içerikten ziyade uzunluğu test etmek için hafif bir kenar. NULL olduğunda eşit zamanlamalardı. Muhtemelen herhangi bir kesin sonuç çıkarmak için yeterince test yapmadım.

Tipik bir yürütme planında, farkın göz ardı edileceğini düşünürdüm ve TSQL'de bu kadar çok dize karşılaştırması yaparsanız, büyük bir fark yaratma olasılığının yüksek olması muhtemelen sizin için farklı bir dil kullanmanız gerekir. o tablo veya dizin taramaları yol açabilecek şekilde

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

Sadece çok sınırlı senaryo ve yürütme planında bunu test hiç bu kadar biraz boş bir dizeye karşılaştırarak destekliyor. (% 49 ila% 51). Bu bellekte bir şeyler ile çalışıyor olsa da, muhtemelen bir tablodaki verilerle karşılaştırmak farklı olabilirdi.

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

SELECT 
    1 
WHERE 
    @testString = '' 

SELECT 
    1 
WHERE 
    LEN(@testString) = 0 

Düzenleme: Bu SQL Server 2005

7

Ben WHERE fıkrada LEN kullanma konusunda dikkatli olurdu. Eğer davranışı, örneğin tanımlamanız gerekir böylece

Ayrıca, saha NULL mümkün olduğu LEN(NULL) = NULL ise dikkat:

-- 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 Sadece bunu fark ettim. –

İlgili konular