一部のプログラミング言語では、コンテンツが0
かどうかを確認するよりも、文字列の長さが""
かどうかを確認する方が速いと聞きました。これはT-SQLにも当てはまりますか?
サンプル:
SELECT user_id FROM users WHERE LEN(user_email) = 0
vs.
SELECT user_id FROM users WHERE user_email = ''
編集私が最初に見てから質問を更新しました。その例では、必ず必ず使用する必要があると言います
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-私は @ 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
LEN
句でWHERE
を使用すると、テーブルまたはインデックスのスキャンにつながる可能性があるため、注意が必要です。
また、フィールドがNULL
able that 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
私は非常に限られたシナリオと実行計画でそれをテストしたばかりなので、空の文字列と比較することはわずかに有利です。 (49%から51%)。これはメモリ内のものを処理しているので、テーブルのデータと比較するとおそらく異なるでしょう。
DECLARE @testString nvarchar(max)
SET @testString = ''
SELECT
1
WHERE
@testString = ''
SELECT
1
WHERE
LEN(@testString) = 0
編集:これはSQL Server 2005の場合です。