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 nullset @cnt = @cnt+1
endselect 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 でテストしました。