web-dev-qa-db-ja.com

空の文字列と比較するよりも、length = 0かどうかを確認する方が速いですか?

一部のプログラミング言語では、コンテンツが0かどうかを確認するよりも、文字列の長さが""かどうかを確認する方が速いと聞きました。これはT-SQLにも当てはまりますか?

サンプル:

SELECT user_id FROM users WHERE LEN(user_email) = 0

vs.

SELECT user_id FROM users WHERE user_email = ''
27
Espo

編集私が最初に見てから質問を更新しました。その例では、必ず必ず使用する必要があると言います

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の答え(=)からタイミングフレームワークを "借用"しました@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
27
Martin Smith

LEN句でWHEREを使用すると、テーブルまたはインデックスのスキャンにつながる可能性があるため、注意が必要です。

また、フィールドがNULLable 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
7
StuartLC

私は非常に限られたシナリオと実行計画でそれをテストしたばかりなので、空の文字列と比較することはわずかに有利です。 (49%から51%)。これはメモリ内のものを処理しているので、テーブルのデータと比較するとおそらく異なるでしょう。

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

SELECT
    1
WHERE
    @testString = ''

SELECT
    1
WHERE
    LEN(@testString) = 0

編集:これはSQL Server 2005の場合です。

5
Evil Pigeon