is not null と len(xxx)>0 の性能比較

nullableなインデックスなしカラムのデータ存在チェック速度を比較してみました@SQL Server 2008 (not R2)

テスト用テーブルはこんな感じ

CREATE TABLE [dbo].[is_not_null_VS_LEN](
    [sid] [int] IDENTITY(1,1) NOT NULL,
    [value] [nvarchar](50) NULL
) ON [PRIMARY]

このテーブルにnullと非null値を半々に100,000レコード格納したものをテストデータとしています。

テストしたクエリ

declare @dustbox table(
    aaa int
)

declare @sets int=0

declare @starttime datetime

declare @cnt int = 0

while @sets<10
begin
    set @starttime = SYSDATETIME()
    set @cnt = 0
    while @cnt<1000
    begin
        –/*テスト対象1*/
        –insert into @dustbox
        –    select COUNT(*) from is_not_null_VS_LEN
        –        where LEN(value)>0
        –/*テスト対象2*/
        –insert into @dustbox
        –    select COUNT(*) from is_not_null_VS_LEN
        –        where value is not null

        set @cnt = @cnt+1
    end

    select datediff(millisecond,  @starttime, SYSDATETIME());
    –select convert(nvarchar, SYSDATETIME()-@starttime, 114);
    delete from @dustbox
    set @sets = @sets+1
end

/*テスト対象x*/と書いてあるところがテスト対象のクエリです。それぞれのコメントを外して実行してテストします。

クエリは1000回おなじものを回して、それを10セット行っています。

結果

個別の計測結果(単位はms)

sets LEN(value)>0 is not null
1 20500 16162
2 19413 14800
3 18887 14929
4 19338 14931
5 19391 14788
6 20644 14647
7 20838 15335
8 19333 16370
9 19472 16212
10 19211 14800

計測結果まとめ

avg 19702.7 15297.4
performance 1 0.776411355

 

結論

is not null の方が22%程度処理時間が短いという結論がでました。

Help

まちがいがあったら是非教えてください。

備考:SQL Server 2008 でテストしました。

コメントを残す